--- zend_alloc.c.orig 2006-11-13 11:30:56.000000000 +0000 +++ zend_alloc.c 2006-11-16 15:08:36.811910300 +0000 @@ -381,18 +381,19 @@ #define ZEND_MM_ALIGNED_SIZE(size) ((size + ZEND_MM_ALIGNMENT - 1) & ZEND_MM_ALIGNMENT_MASK) #define ZEND_MM_ALIGNED_HEADER_SIZE ZEND_MM_ALIGNED_SIZE(sizeof(zend_mm_block)) #define ZEND_MM_ALIGNED_FREE_HEADER_SIZE ZEND_MM_ALIGNED_SIZE(sizeof(zend_mm_free_block)) -#define ZEND_MM_ALIGNED_MIN_HEADER_SIZE (sizeof(zend_mm_block)+END_MAGIC_SIZE>sizeof(zend_mm_free_block)?ZEND_MM_ALIGNED_SIZE(sizeof(zend_mm_block)+END_MAGIC_SIZE):ZEND_MM_ALIGNED_SIZE(sizeof(zend_mm_free_block))) +#define ZEND_MM_MIN_ALLOC_BLOCK_SIZE ZEND_MM_ALIGNED_SIZE(ZEND_MM_ALIGNED_HEADER_SIZE + END_MAGIC_SIZE) +#define ZEND_MM_ALIGNED_MIN_FREE_SIZE ((ZEND_MM_MIN_ALLOC_BLOCK_SIZE > ZEND_MM_ALIGNED_FREE_HEADER_SIZE)?(ZEND_MM_MIN_ALLOC_BLOCK_SIZE):(ZEND_MM_ALIGNED_FREE_HEADER_SIZE)) #define ZEND_MM_ALIGNED_SEGMENT_SIZE ZEND_MM_ALIGNED_SIZE(sizeof(zend_mm_segment)) -#define ZEND_MM_MIN_SIZE (ZEND_MM_ALIGNED_MIN_HEADER_SIZE-(ZEND_MM_ALIGNED_HEADER_SIZE+END_MAGIC_SIZE)) +#define ZEND_MM_MIN_SIZE (ZEND_MM_ALIGNED_MIN_FREE_SIZE-(ZEND_MM_ALIGNED_HEADER_SIZE+END_MAGIC_SIZE)) -#define ZEND_MM_MAX_SMALL_SIZE (((ZEND_MM_NUM_BUCKETS-1)<>ZEND_MM_ALIGNMENT_LOG2)-(ZEND_MM_ALIGNED_MIN_HEADER_SIZE>>ZEND_MM_ALIGNMENT_LOG2)+1) +#define ZEND_MM_BUCKET_INDEX(true_size) ((true_size>>ZEND_MM_ALIGNMENT_LOG2)-(ZEND_MM_ALIGNED_MIN_FREE_SIZE>>ZEND_MM_ALIGNMENT_LOG2)+1) -#define ZEND_MM_SMALL_SIZE(true_size) (true_size < ZEND_MM_MAX_SMALL_SIZE) +#define ZEND_MM_SMALL_SIZE(true_size) (true_size <= ZEND_MM_MAX_SMALL_SIZE) /* Memory calculations */ #define ZEND_MM_BLOCK_AT(blk, offset) ((zend_mm_block *) (((char *) (blk))+(offset))) @@ -584,10 +585,13 @@ zend_mm_heap *heap; #if 0 +{ + int i; for (i = 0; i < ZEND_MM_MAX_SMALL_SIZE; i++) { printf("%3d%c: %3ld %d %2ld\n", i, (i == ZEND_MM_MIN_SIZE?'*':' '), (long)ZEND_MM_TRUE_SIZE(i), ZEND_MM_SMALL_SIZE(ZEND_MM_TRUE_SIZE(i)), (long)ZEND_MM_BUCKET_INDEX(ZEND_MM_TRUE_SIZE(i))); } exit(0); +} #endif storage = handlers->init(params); @@ -1163,7 +1167,7 @@ size_t block_size = ZEND_MM_FREE_BLOCK_SIZE(best_fit); size_t remaining_size = block_size - true_size; - if (remaining_size < ZEND_MM_ALIGNED_MIN_HEADER_SIZE) { + if (remaining_size < ZEND_MM_ALIGNED_MIN_FREE_SIZE) { ZEND_MM_BLOCK(best_fit, ZEND_MM_USED_BLOCK, block_size); } else { zend_mm_free_block *new_free_block; @@ -1241,7 +1245,7 @@ ZEND_MM_LAST_BLOCK(ZEND_MM_BLOCK_AT(best_fit, block_size)); - if (remaining_size < ZEND_MM_ALIGNED_MIN_HEADER_SIZE) { + if (remaining_size < ZEND_MM_ALIGNED_MIN_FREE_SIZE) { ZEND_MM_BLOCK(best_fit, ZEND_MM_USED_BLOCK, block_size); } else { zend_mm_free_block *new_free_block; @@ -1399,7 +1403,7 @@ if (true_size <= ZEND_MM_BLOCK_SIZE(mm_block)) { size_t remaining_size = ZEND_MM_BLOCK_SIZE(mm_block) - true_size; - if (remaining_size >= ZEND_MM_ALIGNED_MIN_HEADER_SIZE) { + if (remaining_size >= ZEND_MM_ALIGNED_MIN_FREE_SIZE) { zend_mm_free_block *new_free_block; HANDLE_BLOCK_INTERRUPTIONS(); @@ -1440,7 +1444,7 @@ HANDLE_BLOCK_INTERRUPTIONS(); zend_mm_remove_from_free_list(heap, (zend_mm_free_block *) next_block); - if (remaining_size < ZEND_MM_ALIGNED_MIN_HEADER_SIZE) { + if (remaining_size < ZEND_MM_ALIGNED_MIN_FREE_SIZE) { ZEND_MM_BLOCK(mm_block, ZEND_MM_USED_BLOCK, block_size); } else { zend_mm_free_block *new_free_block; @@ -1540,7 +1544,7 @@ /* setup guard block */ ZEND_MM_LAST_BLOCK(ZEND_MM_BLOCK_AT(mm_block, block_size)); - if (remaining_size < ZEND_MM_ALIGNED_MIN_HEADER_SIZE) { + if (remaining_size < ZEND_MM_ALIGNED_MIN_FREE_SIZE) { ZEND_MM_BLOCK(mm_block, ZEND_MM_USED_BLOCK, block_size); } else { zend_mm_free_block *new_free_block;