Support VirtualProtect for opcache.protect_memory

Don't enable this on AppVeyor yet, as there is still an open
issue in phar.
This commit is contained in:
Nikita Popov 2019-03-25 15:23:11 +01:00
parent db7aba538d
commit eb8c07fe2f
2 changed files with 23 additions and 0 deletions

View File

@ -305,7 +305,9 @@ static inline int accel_restart_is_active(void)
static inline int accel_activate_add(void)
{
#ifdef ZEND_WIN32
SHM_UNPROTECT();
INCREMENT(mem_usage);
SHM_PROTECT();
#else
struct flock mem_usage_lock;
@ -327,8 +329,10 @@ static inline void accel_deactivate_sub(void)
{
#ifdef ZEND_WIN32
if (ZCG(counted)) {
SHM_UNPROTECT();
DECREMENT(mem_usage);
ZCG(counted) = 0;
SHM_PROTECT();
}
#else
struct flock mem_usage_unlock;

View File

@ -594,6 +594,25 @@ void zend_accel_shared_protect(int mode)
for (i = 0; i < ZSMMG(shared_segments_count); i++) {
mprotect(ZSMMG(shared_segments)[i]->p, ZSMMG(shared_segments)[i]->size, mode);
}
#elif defined(ZEND_WIN32)
int i;
if (!smm_shared_globals) {
return;
}
if (mode) {
mode = PAGE_READONLY;
} else {
mode = PAGE_READWRITE;
}
for (i = 0; i < ZSMMG(shared_segments_count); i++) {
DWORD oldProtect;
if (!VirtualProtect(ZSMMG(shared_segments)[i]->p, ZSMMG(shared_segments)[i]->size, mode, &oldProtect)) {
zend_accel_error(ACCEL_LOG_ERROR, "Failed to protect memory");
}
}
#endif
}