|
33 | 33 |
|
34 | 34 | #define ACCEL_FILEMAP_NAME "ZendOPcache.SharedMemoryArea"
|
35 | 35 | #define ACCEL_MUTEX_NAME "ZendOPcache.SharedMemoryMutex"
|
36 |
| -#define ACCEL_FILEMAP_BASE_DEFAULT 0x01000000 |
37 |
| -#define ACCEL_FILEMAP_BASE "ZendOPcache.MemoryBase" |
38 | 36 | #define ACCEL_EVENT_SOURCE "Zend OPcache"
|
39 | 37 |
|
| 38 | +/* address of mapping base and address of execute_ex */ |
| 39 | +#define ACCEL_BASE_POINTER_SIZE (2 * sizeof(void*)) |
| 40 | + |
40 | 41 | static HANDLE memfile = NULL, memory_mutex = NULL;
|
41 | 42 | static void *mapping_base;
|
42 | 43 |
|
@@ -75,22 +76,6 @@ static char *create_name_with_username(char *name)
|
75 | 76 | return newname;
|
76 | 77 | }
|
77 | 78 |
|
78 |
| -static char *get_mmap_base_file(void) |
79 |
| -{ |
80 |
| - static char windir[MAXPATHLEN+ 32 + 3 + sizeof("\\\\@") + 1 + 32 + 21]; |
81 |
| - int l; |
82 |
| - |
83 |
| - GetTempPath(MAXPATHLEN, windir); |
84 |
| - l = strlen(windir); |
85 |
| - if ('\\' == windir[l-1]) { |
86 |
| - l--; |
87 |
| - } |
88 |
| - |
89 |
| - snprintf(windir + l, sizeof(windir) - l - 1, "\\%s@%.32s@%.20s@%.32s", ACCEL_FILEMAP_BASE, accel_uname_id, sapi_module.name, accel_system_id); |
90 |
| - |
91 |
| - return windir; |
92 |
| -} |
93 |
| - |
94 | 79 | void zend_shared_alloc_create_lock(void)
|
95 | 80 | {
|
96 | 81 | memory_mutex = CreateMutex(NULL, FALSE, create_name_with_username(ACCEL_MUTEX_NAME));
|
@@ -119,39 +104,20 @@ static int zend_shared_alloc_reattach(size_t requested_size, char **error_in)
|
119 | 104 | {
|
120 | 105 | int err;
|
121 | 106 | void *wanted_mapping_base;
|
122 |
| - char *mmap_base_file = get_mmap_base_file(); |
123 |
| - FILE *fp = fopen(mmap_base_file, "r"); |
124 | 107 | MEMORY_BASIC_INFORMATION info;
|
125 | 108 | void *execute_ex_base;
|
126 | 109 | int execute_ex_moved;
|
127 | 110 |
|
128 |
| - if (!fp) { |
129 |
| - err = GetLastError(); |
130 |
| - zend_win_error_message(ACCEL_LOG_WARNING, mmap_base_file, err); |
131 |
| - zend_win_error_message(ACCEL_LOG_FATAL, "Unable to open base address file", err); |
132 |
| - *error_in="fopen"; |
133 |
| - return ALLOC_FAILURE; |
134 |
| - } |
135 |
| - if (!fscanf(fp, "%p", &wanted_mapping_base)) { |
| 111 | + mapping_base = MapViewOfFileEx(memfile, FILE_MAP_ALL_ACCESS, 0, 0, ACCEL_BASE_POINTER_SIZE, NULL); |
| 112 | + if (mapping_base == NULL) { |
136 | 113 | err = GetLastError();
|
137 | 114 | zend_win_error_message(ACCEL_LOG_FATAL, "Unable to read base address", err);
|
138 | 115 | *error_in="read mapping base";
|
139 |
| - fclose(fp); |
140 |
| - return ALLOC_FAILURE; |
141 |
| - } |
142 |
| - if (!fscanf(fp, "%p", &execute_ex_base)) { |
143 |
| - err = GetLastError(); |
144 |
| - zend_win_error_message(ACCEL_LOG_FATAL, "Unable to read execute_ex base address", err); |
145 |
| - *error_in="read execute_ex base"; |
146 |
| - fclose(fp); |
147 | 116 | return ALLOC_FAILURE;
|
148 | 117 | }
|
149 |
| - fclose(fp); |
150 |
| - |
151 |
| - if (0 > win32_utime(mmap_base_file, NULL)) { |
152 |
| - err = GetLastError(); |
153 |
| - zend_win_error_message(ACCEL_LOG_WARNING, mmap_base_file, err); |
154 |
| - } |
| 118 | + wanted_mapping_base = ((void**)mapping_base)[0]; |
| 119 | + execute_ex_base = ((void**)mapping_base)[1]; |
| 120 | + UnmapViewOfFile(mapping_base); |
155 | 121 |
|
156 | 122 | execute_ex_moved = (void *)execute_ex != execute_ex_base;
|
157 | 123 |
|
@@ -207,7 +173,7 @@ static int zend_shared_alloc_reattach(size_t requested_size, char **error_in)
|
207 | 173 | }
|
208 | 174 | return ALLOC_FAIL_MAPPING;
|
209 | 175 | }
|
210 |
| - smm_shared_globals = (zend_smm_shared_globals *) mapping_base; |
| 176 | + smm_shared_globals = (zend_smm_shared_globals *) ((char*)mapping_base + ACCEL_BASE_POINTER_SIZE); |
211 | 177 |
|
212 | 178 | return SUCCESSFULLY_REATTACHED;
|
213 | 179 | }
|
@@ -325,23 +291,12 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_
|
325 | 291 | *error_in = "MapViewOfFile";
|
326 | 292 | return ALLOC_FAILURE;
|
327 | 293 | } else {
|
328 |
| - char *mmap_base_file = get_mmap_base_file(); |
329 |
| - void *execute_ex_base = (void *)execute_ex; |
330 |
| - FILE *fp = fopen(mmap_base_file, "w"); |
331 |
| - if (!fp) { |
332 |
| - err = GetLastError(); |
333 |
| - zend_shared_alloc_unlock_win32(); |
334 |
| - zend_win_error_message(ACCEL_LOG_WARNING, mmap_base_file, err); |
335 |
| - zend_win_error_message(ACCEL_LOG_FATAL, "Unable to write base address", err); |
336 |
| - return ALLOC_FAILURE; |
337 |
| - } |
338 |
| - fprintf(fp, "%p\n", mapping_base); |
339 |
| - fprintf(fp, "%p\n", execute_ex_base); |
340 |
| - fclose(fp); |
| 294 | + ((void**)mapping_base)[0] = mapping_base; |
| 295 | + ((void**)mapping_base)[1] = (void*)execute_ex; |
341 | 296 | }
|
342 | 297 |
|
343 |
| - shared_segment->pos = 0; |
344 |
| - shared_segment->size = requested_size; |
| 298 | + shared_segment->pos = ACCEL_BASE_POINTER_SIZE; |
| 299 | + shared_segment->size = requested_size - ACCEL_BASE_POINTER_SIZE; |
345 | 300 |
|
346 | 301 | zend_shared_alloc_unlock_win32();
|
347 | 302 |
|
|
0 commit comments