diff options
Diffstat (limited to 'Zend/zend_alloc.c')
-rw-r--r-- | Zend/zend_alloc.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 2b5a0716d..942b0d173 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2008 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_alloc.c,v 1.144.2.3.2.47 2008/02/14 14:46:48 dmitry Exp $ */ +/* $Id: zend_alloc.c,v 1.144.2.3.2.54 2009/01/25 14:04:09 dsp Exp $ */ #include "zend.h" #include "zend_alloc.h" @@ -164,7 +164,7 @@ static zend_mm_segment* zend_mm_mem_mmap_realloc(zend_mm_storage *storage, zend_ static void zend_mm_mem_mmap_free(zend_mm_storage *storage, zend_mm_segment* segment) { - munmap(segment, segment->size); + munmap((void*)segment, segment->size); } #endif @@ -399,9 +399,9 @@ struct _zend_mm_heap { size_t compact_size; zend_mm_segment *segments_list; zend_mm_storage *storage; - size_t real_size; + size_t real_size; size_t real_peak; - size_t limit; + size_t limit; size_t size; size_t peak; size_t reserve_size; @@ -432,8 +432,8 @@ struct _zend_mm_heap { #define ZEND_MM_REST_BUCKET(heap) \ (zend_mm_free_block*)((char*)&heap->rest_buckets[0] + \ - sizeof(zend_mm_free_block*) * 2 - \ - sizeof(zend_mm_small_free_block)) + sizeof(zend_mm_free_block*) * 2 - \ + sizeof(zend_mm_small_free_block)) #if ZEND_MM_COOKIES @@ -1061,16 +1061,26 @@ ZEND_API zend_mm_heap *zend_mm_startup_ex(const zend_mm_mem_handlers *handlers, } if (internal) { int i; - zend_mm_free_block *p; + zend_mm_free_block *p, *q, *orig; zend_mm_heap *mm_heap = _zend_mm_alloc_int(heap, sizeof(zend_mm_heap) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC); *mm_heap = *heap; p = ZEND_MM_SMALL_FREE_BUCKET(mm_heap, 0); + orig = ZEND_MM_SMALL_FREE_BUCKET(heap, 0); for (i = 0; i < ZEND_MM_NUM_BUCKETS; i++) { - p->prev_free_block->next_free_block = p; - p->next_free_block->prev_free_block = p; + q = p; + while (q->prev_free_block != orig) { + q = q->prev_free_block; + } + q->prev_free_block = p; + q = p; + while (q->next_free_block != orig) { + q = q->next_free_block; + } + q->next_free_block = p; p = (zend_mm_free_block*)((char*)p + sizeof(zend_mm_free_block*) * 2); + orig = (zend_mm_free_block*)((char*)orig + sizeof(zend_mm_free_block*) * 2); if (mm_heap->large_free_buckets[i]) { mm_heap->large_free_buckets[i]->parent = &mm_heap->large_free_buckets[i]; } @@ -1115,7 +1125,10 @@ ZEND_API zend_mm_heap *zend_mm_startup(void) if (tmp) { seg_size = zend_atoi(tmp, 0); if (zend_mm_low_bit(seg_size) != zend_mm_high_bit(seg_size)) { - fprintf(stderr, "ZEND_MM_SEG_SIZE must be a power ow two.\n"); + fprintf(stderr, "ZEND_MM_SEG_SIZE must be a power of two\n"); + exit(255); + } else if (seg_size < ZEND_MM_ALIGNED_SEGMENT_SIZE + ZEND_MM_ALIGNED_HEADER_SIZE) { + fprintf(stderr, "ZEND_MM_SEG_SIZE is too small\n"); exit(255); } } else { @@ -1791,7 +1804,7 @@ static void *_zend_mm_alloc_int(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_D heap->cache_stat[ZEND_MM_NUM_BUCKETS].miss++; #endif - best_fit = zend_mm_search_large_block(heap, true_size); + best_fit = zend_mm_search_large_block(heap, true_size); if (!best_fit && heap->real_size >= heap->limit - heap->block_size) { zend_mm_free_block *p = heap->rest_buckets[0]; |