From: Dmitry Stogov Date: Sat, 29 Sep 2007 10:37:39 +0000 (+0000) Subject: Added "compact" handler for Zend MM storage. X-Git-Tag: RELEASE_2_0_0a1~1712 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5823265114aec10b1aaf0039ea31471490484ea0;p=php Added "compact" handler for Zend MM storage. --- diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index b62c0fec1d..045208acfd 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -146,6 +146,11 @@ static void zend_mm_mem_dummy_dtor(zend_mm_storage *storage) /* {{{ */ } /* }}} */ +static void zend_mm_mem_dummy_compact(zend_mm_storage *storage) /* {{{ */ +{ +} +/* }}} */ + #if defined(HAVE_MEM_MMAP_ANON) || defined(HAVE_MEM_MMAP_ZERO) static zend_mm_segment* zend_mm_mem_mmap_realloc(zend_mm_storage *storage, zend_mm_segment* segment, size_t size) /* {{{ */ @@ -187,7 +192,7 @@ static zend_mm_segment* zend_mm_mem_mmap_anon_alloc(zend_mm_storage *storage, si } /* }}} */ -# define ZEND_MM_MEM_MMAP_ANON_DSC {"mmap_anon", zend_mm_mem_dummy_init, zend_mm_mem_dummy_dtor, zend_mm_mem_mmap_anon_alloc, zend_mm_mem_mmap_realloc, zend_mm_mem_mmap_free} +# define ZEND_MM_MEM_MMAP_ANON_DSC {"mmap_anon", zend_mm_mem_dummy_init, zend_mm_mem_dummy_dtor, zend_mm_mem_dummy_compact, zend_mm_mem_mmap_anon_alloc, zend_mm_mem_mmap_realloc, zend_mm_mem_mmap_free} #endif @@ -225,7 +230,7 @@ static zend_mm_segment* zend_mm_mem_mmap_zero_alloc(zend_mm_storage *storage, si } /* }}} */ -# define ZEND_MM_MEM_MMAP_ZERO_DSC {"mmap_zero", zend_mm_mem_mmap_zero_init, zend_mm_mem_mmap_zero_dtor, zend_mm_mem_mmap_zero_alloc, zend_mm_mem_mmap_realloc, zend_mm_mem_mmap_free} +# define ZEND_MM_MEM_MMAP_ZERO_DSC {"mmap_zero", zend_mm_mem_mmap_zero_init, zend_mm_mem_mmap_zero_dtor, zend_mm_mem_dummy_compact, zend_mm_mem_mmap_zero_alloc, zend_mm_mem_mmap_realloc, zend_mm_mem_mmap_free} #endif @@ -252,6 +257,13 @@ static void zend_mm_mem_win32_dtor(zend_mm_storage *storage) /* {{{ */ } /* }}} */ +static void zend_mm_mem_win32_compact(zend_mm_storage *storage) /* {{{ */ +{ + HeapDestroy((HANDLE)storage->data); + storage->data = (void*)HeapCreate(HEAP_NO_SERIALIZE, 0, 0); +} +/* }}} */ + static zend_mm_segment* zend_mm_mem_win32_alloc(zend_mm_storage *storage, size_t size) /* {{{ */ { return (zend_mm_segment*) HeapAlloc((HANDLE)storage->data, HEAP_NO_SERIALIZE, size); @@ -270,7 +282,7 @@ static zend_mm_segment* zend_mm_mem_win32_realloc(zend_mm_storage *storage, zend } /* }}} */ -# define ZEND_MM_MEM_WIN32_DSC {"win32", zend_mm_mem_win32_init, zend_mm_mem_win32_dtor, zend_mm_mem_win32_alloc, zend_mm_mem_win32_realloc, zend_mm_mem_win32_free} +# define ZEND_MM_MEM_WIN32_DSC {"win32", zend_mm_mem_win32_init, zend_mm_mem_win32_dtor, zend_mm_mem_win32_compact, zend_mm_mem_win32_alloc, zend_mm_mem_win32_realloc, zend_mm_mem_win32_free} #endif @@ -294,7 +306,7 @@ static void zend_mm_mem_malloc_free(zend_mm_storage *storage, zend_mm_segment *p } /* }}} */ -# define ZEND_MM_MEM_MALLOC_DSC {"malloc", zend_mm_mem_dummy_init, zend_mm_mem_dummy_dtor, zend_mm_mem_malloc_alloc, zend_mm_mem_malloc_realloc, zend_mm_mem_malloc_free} +# define ZEND_MM_MEM_MALLOC_DSC {"malloc", zend_mm_mem_dummy_init, zend_mm_mem_dummy_dtor, zend_mm_mem_dummy_compact, zend_mm_mem_malloc_alloc, zend_mm_mem_malloc_realloc, zend_mm_mem_malloc_free} #endif @@ -1591,15 +1603,7 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, int full_shutdown, int silent free(heap); } } else { -#ifdef HAVE_MEM_WIN32 - /* FIX for bug #41713 */ - /* TODO: add new "compact" handler */ - if (storage->handlers->dtor == zend_mm_mem_win32_dtor && - storage->handlers->init == zend_mm_mem_win32_init) { - HeapDestroy((HANDLE)storage->data); - storage->data = (void*)HeapCreate(HEAP_NO_SERIALIZE, 0, 0); - } -#endif + storage->handlers->compact(storage); heap->segments_list = NULL; zend_mm_init(heap); heap->real_size = 0; diff --git a/Zend/zend_alloc.h b/Zend/zend_alloc.h index fb63a85f09..2e18dee8f2 100644 --- a/Zend/zend_alloc.h +++ b/Zend/zend_alloc.h @@ -211,6 +211,7 @@ typedef struct _zend_mm_mem_handlers { const char *name; zend_mm_storage* (*init)(void *params); void (*dtor)(zend_mm_storage *storage); + void (*compact)(zend_mm_storage *storage); zend_mm_segment* (*_alloc)(zend_mm_storage *storage, size_t size); zend_mm_segment* (*_realloc)(zend_mm_storage *storage, zend_mm_segment *ptr, size_t size); void (*_free)(zend_mm_storage *storage, zend_mm_segment *ptr);