diff options
author | Dmitry Stogov <dmitry@php.net> | 2010-07-07 10:34:50 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2010-07-07 10:34:50 +0000 |
commit | 3ea5bc7914302d51d5252c04a0e355661a13d424 (patch) | |
tree | 4ad318d9c0e007cbb6b4dd3e9d9eaa92a4686e9c | |
parent | d3efe97a2e260fddced7c878a4d5bb1241c48f33 (diff) | |
download | php-git-3ea5bc7914302d51d5252c04a0e355661a13d424.tar.gz |
Reused single segment between requests. Saved one malloc/free for each request.
-rw-r--r-- | Zend/zend_alloc.c | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index e71456ab37..760b0dcb2f 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -1632,27 +1632,54 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, int full_shutdown, int silent internal = heap->internal; storage = heap->storage; segment = heap->segments_list; - while (segment) { - prev = segment; - segment = segment->next_segment; - ZEND_MM_STORAGE_FREE(prev); - } if (full_shutdown) { + while (segment) { + prev = segment; + segment = segment->next_segment; + ZEND_MM_STORAGE_FREE(prev); + } + heap->segments_list = NULL; storage->handlers->dtor(storage); if (!internal) { free(heap); } } else { + if (segment) { + if (heap->reserve_size) { + while (segment->next_segment) { + prev = segment; + segment = segment->next_segment; + ZEND_MM_STORAGE_FREE(prev); + } + heap->segments_list = segment; + } else { + do { + prev = segment; + segment = segment->next_segment; + ZEND_MM_STORAGE_FREE(prev); + } while (segment); + heap->segments_list = NULL; + } + } 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; heap->real_peak = 0; heap->size = 0; heap->peak = 0; + if (heap->segments_list) { + /* mark segment as a free block */ + zend_mm_free_block *b = (zend_mm_free_block*)((char*)heap->segments_list + ZEND_MM_ALIGNED_SEGMENT_SIZE); + size_t block_size = heap->segments_list->size - ZEND_MM_ALIGNED_SEGMENT_SIZE - ZEND_MM_ALIGNED_HEADER_SIZE; + + ZEND_MM_MARK_FIRST_BLOCK(b); + ZEND_MM_LAST_BLOCK(ZEND_MM_BLOCK_AT(b, block_size)); + ZEND_MM_BLOCK(b, ZEND_MM_FREE_BLOCK, block_size); + zend_mm_add_to_free_list(heap, b); + } if (heap->reserve_size) { heap->reserve = _zend_mm_alloc_int(heap, heap->reserve_size ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC); } |