summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2006-08-22 05:54:15 +0000
committerDmitry Stogov <dmitry@php.net>2006-08-22 05:54:15 +0000
commit4180155a4791c65aa2c184de99185e30d4d66d0a (patch)
tree99f91d02bae2e7f066c68905cdf43d26a4537553
parent3fd1e9c3db0039d7a840134378dfd63e0503e6f0 (diff)
downloadphp-git-4180155a4791c65aa2c184de99185e30d4d66d0a.tar.gz
Fixed "win32" storage manager
-rw-r--r--Zend/zend_alloc.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index f27dfe5027..1803c78a06 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -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}