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;
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
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;
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;
}
/* }}} */
free(heap);
}
} else {
- storage->handlers->compact(storage);
+ if (heap->compact_size &&
+ heap->real_peak > heap->compact_size) {
+ storage->handlers->compact(storage);
+ }
heap->segments_list = NULL;
zend_mm_init(heap);
heap->real_size = 0;