mirror of
https://github.com/php/php-src.git
synced 2024-09-22 18:37:25 +00:00
Merge branch 'PHP-7.4'
* PHP-7.4: Revert "Merge branch 'PHP-7.3' into PHP-7.4"
This commit is contained in:
commit
da0f3279ea
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user