summaryrefslogtreecommitdiff
path: root/Zend/zend_alloc.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2007-10-25 07:30:29 +0000
committerDmitry Stogov <dmitry@php.net>2007-10-25 07:30:29 +0000
commit602f26dc0824b437732dc151f7205c02ce77698b (patch)
tree40e9545aeeb55a49148ab2f11099214ac98146b9 /Zend/zend_alloc.c
parent68f328560d4730c73b70776e9574e8ac11e80e39 (diff)
downloadphp-git-602f26dc0824b437732dc151f7205c02ce77698b.tar.gz
Added ability to control memory consumption between request using ZEND_MM_COMPACT environment variable
Diffstat (limited to 'Zend/zend_alloc.c')
-rw-r--r--Zend/zend_alloc.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 7801750b90..78d7116896 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -396,6 +396,7 @@ struct _zend_mm_heap {
size_t free_bitmap;
size_t large_free_bitmap;
size_t block_size;
+ size_t compact_size;
zend_mm_segment *segments_list;
zend_mm_storage *storage;
size_t real_size;
@@ -1028,6 +1029,7 @@ ZEND_API zend_mm_heap *zend_mm_startup_ex(const zend_mm_mem_handlers *handlers,
heap->storage = storage;
heap->block_size = block_size;
+ heap->compact_size = 0;
heap->segments_list = NULL;
zend_mm_init(heap);
# if ZEND_MM_CACHE_STAT
@@ -1078,6 +1080,7 @@ ZEND_API zend_mm_heap *zend_mm_startup(void)
char *mem_type = getenv("ZEND_MM_MEM_TYPE");
char *tmp;
const zend_mm_mem_handlers *handlers;
+ zend_mm_heap *heap;
if (mem_type == NULL) {
i = 0;
@@ -1109,7 +1112,16 @@ ZEND_API zend_mm_heap *zend_mm_startup(void)
seg_size = ZEND_MM_SEG_SIZE;
}
- return zend_mm_startup_ex(handlers, seg_size, ZEND_MM_RESERVE_SIZE, 0, NULL);
+ heap = zend_mm_startup_ex(handlers, seg_size, ZEND_MM_RESERVE_SIZE, 0, NULL);
+ if (heap) {
+ tmp = getenv("ZEND_MM_COMPACT");
+ if (tmp) {
+ heap->compact_size = zend_atoi(tmp, 0);
+ } else {
+ heap->compact_size = 2 * 1024 * 1024;
+ }
+ }
+ return heap;
}
#if ZEND_DEBUG
@@ -1563,7 +1575,9 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, int full_shutdown, int silent
#ifdef HAVE_MEM_WIN32
/* FIX for bug #41713 */
/* TODO: add new "compact" handler */
- if (storage->handlers->dtor == zend_mm_mem_win32_dtor &&
+ if (heap->compact_size &&
+ heap->real_peak > heap->compact_size &&
+ storage->handlers->dtor == zend_mm_mem_win32_dtor &&
storage->handlers->init == zend_mm_mem_win32_init) {
HeapDestroy((HANDLE)storage->data);
storage->data = (void*)HeapCreate(HEAP_NO_SERIALIZE, 0, 0);