summaryrefslogtreecommitdiff
path: root/ext/opcache/zend_shared_alloc.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-10-25 19:24:39 +0300
committerDmitry Stogov <dmitry@zend.com>2018-10-25 19:24:39 +0300
commitf33da6f3387d4d4a2b820986aec11c8e37141c6c (patch)
tree2653d4874b5b25921e72156b0a667e1f681dfcd0 /ext/opcache/zend_shared_alloc.c
parent3d415644f7dd37ed0ed2d344902ed0e1dbef2f0c (diff)
downloadphp-git-f33da6f3387d4d4a2b820986aec11c8e37141c6c.tar.gz
Don't use request heap at shutdown
Diffstat (limited to 'ext/opcache/zend_shared_alloc.c')
-rw-r--r--ext/opcache/zend_shared_alloc.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/ext/opcache/zend_shared_alloc.c b/ext/opcache/zend_shared_alloc.c
index fe8d470d58..63cc988d27 100644
--- a/ext/opcache/zend_shared_alloc.c
+++ b/ext/opcache/zend_shared_alloc.c
@@ -259,6 +259,7 @@ int zend_shared_alloc_startup(size_t requested_size)
void zend_shared_alloc_shutdown(void)
{
zend_shared_segment **tmp_shared_segments;
+ zend_shared_segment *shared_segments_buf[16];
size_t shared_segments_array_size;
zend_smm_shared_globals tmp_shared_globals;
int i;
@@ -266,14 +267,20 @@ void zend_shared_alloc_shutdown(void)
tmp_shared_globals = *smm_shared_globals;
smm_shared_globals = &tmp_shared_globals;
shared_segments_array_size = ZSMMG(shared_segments_count) * (S_H(segment_type_size)() + sizeof(void *));
- tmp_shared_segments = emalloc(shared_segments_array_size);
+ if (shared_segments_array_size > 16) {
+ tmp_shared_segments = malloc(shared_segments_array_size);
+ } else {
+ tmp_shared_segments = shared_segments_buf;
+ }
copy_shared_segments(tmp_shared_segments, ZSMMG(shared_segments)[0], ZSMMG(shared_segments_count), S_H(segment_type_size)());
ZSMMG(shared_segments) = tmp_shared_segments;
for (i = 0; i < ZSMMG(shared_segments_count); i++) {
S_H(detach_segment)(ZSMMG(shared_segments)[i]);
}
- efree(ZSMMG(shared_segments));
+ if (shared_segments_array_size > 16) {
+ free(ZSMMG(shared_segments));
+ }
ZSMMG(shared_segments) = NULL;
g_shared_alloc_handler = NULL;
#ifndef ZEND_WIN32