]> granicus.if.org Git - php/commitdiff
Added "compact" handler for Zend MM storage.
authorDmitry Stogov <dmitry@php.net>
Sat, 29 Sep 2007 10:37:39 +0000 (10:37 +0000)
committerDmitry Stogov <dmitry@php.net>
Sat, 29 Sep 2007 10:37:39 +0000 (10:37 +0000)
Zend/zend_alloc.c
Zend/zend_alloc.h

index b62c0fec1ddca7713d1f9c3f910bed53a1ce5508..045208acfd697bca4c502c24e0ab45c4d4b5786e 100644 (file)
@@ -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;
index fb63a85f09b11b93a7091250adae8768d4998e39..2e18dee8f2010b45c02c1eb4ef9e4de8c4e8d5ce 100644 (file)
@@ -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);