diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2020-07-29 13:37:50 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2020-07-29 13:38:53 +0200 |
commit | da0f3279ea26ddb82c156600d43d4c9ab5893fa0 (patch) | |
tree | 9d9f4bcd5b2165d4be0d7fec5781c8849b59d72a | |
parent | 687e14ddc220195390a68ce6ea43b0f55bad4aff (diff) | |
parent | 826b90a5f0ae355d93ba342419033e08aabc63b7 (diff) | |
download | php-git-da0f3279ea26ddb82c156600d43d4c9ab5893fa0.tar.gz |
Merge branch 'PHP-7.4'
* PHP-7.4:
Revert "Merge branch 'PHP-7.3' into PHP-7.4"
-rw-r--r-- | ext/opcache/shared_alloc_win32.c | 71 |
1 files changed, 58 insertions, 13 deletions
diff --git a/ext/opcache/shared_alloc_win32.c b/ext/opcache/shared_alloc_win32.c index 337cf9d7db..856e33696a 100644 --- a/ext/opcache/shared_alloc_win32.c +++ b/ext/opcache/shared_alloc_win32.c @@ -33,11 +33,10 @@ #define ACCEL_FILEMAP_NAME "ZendOPcache.SharedMemoryArea" #define ACCEL_MUTEX_NAME "ZendOPcache.SharedMemoryMutex" +#define ACCEL_FILEMAP_BASE_DEFAULT 0x01000000 +#define ACCEL_FILEMAP_BASE "ZendOPcache.MemoryBase" #define ACCEL_EVENT_SOURCE "Zend OPcache" -/* address of mapping base and address of execute_ex */ -#define ACCEL_BASE_POINTER_SIZE (2 * sizeof(void*)) - static HANDLE memfile = NULL, memory_mutex = NULL; static void *mapping_base; @@ -76,6 +75,22 @@ static char *create_name_with_username(char *name) return newname; } +static char *get_mmap_base_file(void) +{ + static char windir[MAXPATHLEN+ 32 + 3 + sizeof("\\\\@") + 1 + 32 + 21]; + int l; + + GetTempPath(MAXPATHLEN, windir); + l = strlen(windir); + if ('\\' == windir[l-1]) { + l--; + } + + snprintf(windir + l, sizeof(windir) - l - 1, "\\%s@%.32s@%.20s@%.32s", ACCEL_FILEMAP_BASE, accel_uname_id, sapi_module.name, accel_system_id); + + return windir; +} + void zend_shared_alloc_create_lock(void) { memory_mutex = CreateMutex(NULL, FALSE, create_name_with_username(ACCEL_MUTEX_NAME)); @@ -104,20 +119,39 @@ static int zend_shared_alloc_reattach(size_t requested_size, char **error_in) { int err; void *wanted_mapping_base; + char *mmap_base_file = get_mmap_base_file(); + FILE *fp = fopen(mmap_base_file, "r"); MEMORY_BASIC_INFORMATION info; void *execute_ex_base; int execute_ex_moved; - mapping_base = MapViewOfFileEx(memfile, FILE_MAP_ALL_ACCESS, 0, 0, ACCEL_BASE_POINTER_SIZE, NULL); - if (mapping_base == NULL) { + if (!fp) { + err = GetLastError(); + zend_win_error_message(ACCEL_LOG_WARNING, mmap_base_file, err); + zend_win_error_message(ACCEL_LOG_FATAL, "Unable to open base address file", err); + *error_in="fopen"; + return ALLOC_FAILURE; + } + if (!fscanf(fp, "%p", &wanted_mapping_base)) { err = GetLastError(); zend_win_error_message(ACCEL_LOG_FATAL, "Unable to read base address", err); *error_in="read mapping base"; + fclose(fp); return ALLOC_FAILURE; } - wanted_mapping_base = ((void**)mapping_base)[0]; - execute_ex_base = ((void**)mapping_base)[1]; - UnmapViewOfFile(mapping_base); + if (!fscanf(fp, "%p", &execute_ex_base)) { + err = GetLastError(); + zend_win_error_message(ACCEL_LOG_FATAL, "Unable to read execute_ex base address", err); + *error_in="read execute_ex base"; + fclose(fp); + return ALLOC_FAILURE; + } + fclose(fp); + + if (0 > win32_utime(mmap_base_file, NULL)) { + err = GetLastError(); + zend_win_error_message(ACCEL_LOG_WARNING, mmap_base_file, err); + } execute_ex_moved = (void *)execute_ex != execute_ex_base; @@ -182,7 +216,7 @@ static int zend_shared_alloc_reattach(size_t requested_size, char **error_in) } } - smm_shared_globals = (zend_smm_shared_globals *) ((char*)mapping_base + ACCEL_BASE_POINTER_SIZE); + smm_shared_globals = (zend_smm_shared_globals *) mapping_base; return SUCCESSFULLY_REATTACHED; } @@ -300,6 +334,9 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ *error_in = "MapViewOfFile"; return ALLOC_FAILURE; } else { + char *mmap_base_file; + void *execute_ex_base = (void *)execute_ex; + FILE *fp; DWORD old; if (!VirtualProtect(mapping_base, requested_size, PAGE_READWRITE, &old)) { @@ -307,11 +344,19 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ zend_win_error_message(ACCEL_LOG_FATAL, "VirtualProtect() failed", err); return ALLOC_FAILURE; } - - ((void**)mapping_base)[0] = mapping_base; - ((void**)mapping_base)[1] = (void*)execute_ex; - ((char*)shared_segment->p) += ACCEL_BASE_POINTER_SIZE; + mmap_base_file = get_mmap_base_file(); + fp = fopen(mmap_base_file, "w"); + if (!fp) { + err = GetLastError(); + zend_shared_alloc_unlock_win32(); + zend_win_error_message(ACCEL_LOG_WARNING, mmap_base_file, err); + zend_win_error_message(ACCEL_LOG_FATAL, "Unable to write base address", err); + return ALLOC_FAILURE; } + fprintf(fp, "%p\n", mapping_base); + fprintf(fp, "%p\n", execute_ex_base); + fclose(fp); + } shared_segment->pos = 0; shared_segment->size = requested_size; |