cvs: ZendEngine2 / zend_alloc.c
| From: | Dmitry Stogov | Date: | Fri, 10 Nov 2006 10:44:17 +0000 |
| Subject: | cvs: ZendEngine2 / zend_alloc.c | ||
| Groups: | php.zend-engine.cvs | ||
| Request: | Send a blank email to php-zend-engine-cvs+get-5377@lists.php.net to get a copy of this message | ||
dmitry Fri Nov 10 10:44:17 2006 UTC
Modified files:
/ZendEngine2 zend_alloc.c
Log:
Zend Memory Manager Improvements
. use HeapAlloc() instead of VirtualAlloc()
. use "win32" storage manager (instead of "malloc") on Windows by default
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_alloc.c?r1=1.163&r2=1.164&diff_format=u
Index: ZendEngine2/zend_alloc.c
diff -u ZendEngine2/zend_alloc.c:1.163 ZendEngine2/zend_alloc.c:1.164
--- ZendEngine2/zend_alloc.c:1.163 Thu Oct 12 06:47:04 2006
+++ ZendEngine2/zend_alloc.c Fri Nov 10 10:44:16 2006
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_alloc.c,v 1.163 2006/10/12 06:47:04 dmitry Exp $ */
+/* $Id: zend_alloc.c,v 1.164 2006/11/10 10:44:16 dmitry Exp $ */
#include "zend.h"
#include "zend_alloc.h"
@@ -185,35 +185,41 @@
#ifdef HAVE_MEM_WIN32
+static zend_mm_storage* zend_mm_mem_win32_init(void *params)
+{
+ HANDLE heap = HeapCreate(HEAP_NO_SERIALIZE, 0, 0);
+ zend_mm_storage* storage;
+
+ if (heap == NULL) {
+ return NULL;
+ }
+ storage = (zend_mm_storage*)malloc(sizeof(zend_mm_storage));
+ storage->data = (void*) heap;
+ return storage;
+}
+
+static void zend_mm_mem_win32_dtor(zend_mm_storage *storage)
+{
+ HeapDestroy((HANDLE)storage->data);
+ free(storage);
+}
+
static zend_mm_segment* zend_mm_mem_win32_alloc(zend_mm_storage *storage, size_t size)
{
- return (zend_mm_segment*) VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
+ return (zend_mm_segment*) HeapAlloc((HANDLE)storage->data, HEAP_NO_SERIALIZE, size);
}
static void zend_mm_mem_win32_free(zend_mm_storage *storage, zend_mm_segment* segment)
{
- VirtualFree(segment, segment->size, MEM_RELEASE);
+ HeapFree((HANDLE)storage->data, HEAP_NO_SERIALIZE, segment);
}
static zend_mm_segment* zend_mm_mem_win32_realloc(zend_mm_storage *storage, zend_mm_segment*
segment, size_t size)
{
- if (size < segment->size) {
- VirtualFree((char*)segment + size, segment->size - size, MEM_RELEASE);
- } else if (size > segment->size) {
- if (!VirtualAlloc((char*)segment + segment->size, size - segment->size,
MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE)) {
- zend_mm_segment *ret = zend_mm_mem_win32_alloc(storage, size);
-
- if (ret) {
- memcpy(ret, segment, size > segment->size ? segment->size : size);
- zend_mm_mem_win32_free(storage, segment);
- }
- segment = ret;
- }
- }
- return segment;
+ return (zend_mm_segment*) HeapReAlloc((HANDLE)storage->data, HEAP_NO_SERIALIZE, segment, size);
}
-# define ZEND_MM_MEM_WIN32_DSC {"win32", zend_mm_mem_dummy_init, zend_mm_mem_dummy_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_alloc, zend_mm_mem_win32_realloc, zend_mm_mem_win32_free}
#endif
@@ -239,6 +245,9 @@
#endif
static const zend_mm_mem_handlers mem_handlers[] = {
+#ifdef HAVE_MEM_WIN32
+ ZEND_MM_MEM_WIN32_DSC,
+#endif
#ifdef HAVE_MEM_MALLOC
ZEND_MM_MEM_MALLOC_DSC,
#endif
@@ -248,9 +257,6 @@
#ifdef HAVE_MEM_MMAP_ZERO
ZEND_MM_MEM_MMAP_ZERO_DSC,
#endif
-#ifdef HAVE_MEM_WIN32
- ZEND_MM_MEM_WIN32_DSC,
-#endif
{NULL, NULL, NULL, NULL, NULL, NULL}
};