]> granicus.if.org Git - php/commitdiff
Allow user defined malloc/realloc/free
authorDmitry Stogov <dmitry@php.net>
Tue, 6 Nov 2007 07:37:50 +0000 (07:37 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 6 Nov 2007 07:37:50 +0000 (07:37 +0000)
Zend/zend_alloc.c
Zend/zend_alloc.h

index f07b916ed282235ca076c25b9bde6c2b59e78375..b1f9d03cc7e267bd0542b6c48a4e8c2fcaaa54a8 100644 (file)
@@ -423,6 +423,9 @@ typedef struct _zend_mm_free_block {
 
 struct _zend_mm_heap {
        int                 use_zend_alloc;
+       void               *(*malloc)(size_t);
+       void                (*free)(void*);
+       void               *(*realloc)(void*, size_t);
        size_t              free_bitmap;
        size_t              large_free_bitmap;
        size_t              block_size;
@@ -2306,7 +2309,7 @@ ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) /*
        TSRMLS_FETCH();
 
        if (UNEXPECTED(!AG(mm_heap)->use_zend_alloc)) {
-               return malloc(size);
+               return AG(mm_heap)->malloc(size);
        }
        return _zend_mm_alloc_int(AG(mm_heap), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
 }
@@ -2317,7 +2320,7 @@ ZEND_API void _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) /* {{{
        TSRMLS_FETCH();
 
        if (UNEXPECTED(!AG(mm_heap)->use_zend_alloc)) {
-               free(ptr);
+               AG(mm_heap)->free(ptr);
                return;
        }
        _zend_mm_free_int(AG(mm_heap), ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
@@ -2329,7 +2332,7 @@ ZEND_API void *_erealloc(void *ptr, size_t size, int allow_failure ZEND_FILE_LIN
        TSRMLS_FETCH();
 
        if (UNEXPECTED(!AG(mm_heap)->use_zend_alloc)) {
-               return realloc(ptr, size);
+               return AG(mm_heap)->realloc(ptr, size);
        }
        return _zend_mm_realloc_int(AG(mm_heap), ptr, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
 }
@@ -2591,6 +2594,11 @@ static void alloc_globals_ctor(zend_alloc_globals *alloc_globals TSRMLS_DC) /* {
        tmp = getenv("USE_ZEND_ALLOC");
        if (tmp) {
                alloc_globals->mm_heap->use_zend_alloc = zend_atoi(tmp, 0);
+               if (!alloc_globals->mm_heap->use_zend_alloc) {
+                       alloc_globals->mm_heap->malloc = malloc;
+                       alloc_globals->mm_heap->free = free;
+                       alloc_globals->mm_heap->realloc = realloc;
+               }
        }
 }
 /* }}} */
@@ -2629,6 +2637,17 @@ ZEND_API zend_mm_storage *zend_mm_get_storage(zend_mm_heap *heap) /* {{{ */
 }
 /* }}} */
 
+ZEND_API void zend_mm_set_custom_handlers(zend_mm_heap *heap,
+                                          void* (*malloc)(size_t),
+                                          void  (*free)(void*),
+                                          void* (realloc)(void*, size_t))
+{
+       heap->use_zend_alloc = 0;
+       heap->malloc = malloc;
+       heap->free = free;
+       heap->realloc = realloc;
+}
+
 #if ZEND_DEBUG
 ZEND_API int _mem_block_check(void *ptr, int silent ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) /* {{{ */
 {
index 2e18dee8f2010b45c02c1eb4ef9e4de8c4e8d5ce..43410d406a022c2a6f1eaf60b000ace186bdc4f6 100644 (file)
@@ -226,6 +226,11 @@ ZEND_API zend_mm_heap *zend_mm_startup_ex(const zend_mm_mem_handlers *handlers,
 ZEND_API zend_mm_heap *zend_mm_set_heap(zend_mm_heap *new_heap TSRMLS_DC);
 ZEND_API zend_mm_storage *zend_mm_get_storage(zend_mm_heap *heap);
 
+ZEND_API void zend_mm_set_custom_handlers(zend_mm_heap *heap,
+                                          void* (*malloc)(size_t),
+                                          void  (*free)(void*),
+                                          void* (realloc)(void*, size_t));
+
 #endif
 
 /*