summaryrefslogtreecommitdiff
path: root/Zend/zend_alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_alloc.c')
-rw-r--r--Zend/zend_alloc.c37
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];