]> granicus.if.org Git - php/commitdiff
Fixed "win32" storage manager
authorDmitry Stogov <dmitry@php.net>
Tue, 22 Aug 2006 05:54:35 +0000 (05:54 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 22 Aug 2006 05:54:35 +0000 (05:54 +0000)
Zend/zend_alloc.c

index eca36b2895eddb8f4298e800ced057c418439237..1fc7579a9b4b8f2a655e293d3a77a1562d480f1e 100644 (file)
@@ -187,27 +187,30 @@ static zend_mm_segment* zend_mm_mem_mmap_zero_alloc(zend_mm_storage *storage, si
 
 static zend_mm_segment* zend_mm_mem_win32_alloc(zend_mm_storage *storage, size_t size)
 {
-       if (VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE)) {
-               return malloc(sizeof(zend_mm_storage));
-       } else {
-               return NULL;
-       }
+       return (zend_mm_segment*) VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
 }
 
 static void zend_mm_mem_win32_free(zend_mm_storage *storage, zend_mm_segment* segment)
 {
-       VirtualFree(segment, 0, MEM_RELEASE);
-       free(storage);
+       VirtualFree(segment, segment->size, MEM_RELEASE);
 }
 
 static zend_mm_segment* zend_mm_mem_win32_realloc(zend_mm_storage *storage, zend_mm_segment* segment, size_t size)
 {
-       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);
+       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 ret;
+       return segment;
 }
 
 # 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}