@@ -415,11 +415,40 @@ stderr_last_error(char *msg)
415
415
/* OS Allocation */
416
416
/*****************/
417
417
418
+ static void zend_mm_munmap (void * addr , size_t size )
419
+ {
420
+ #ifdef _WIN32
421
+ if (VirtualFree (addr , 0 , MEM_RELEASE ) == 0 ) {
422
+ #if ZEND_MM_ERROR
423
+ stderr_last_error ("VirtualFree() failed" );
424
+ #endif
425
+ }
426
+ #else
427
+ if (munmap (addr , size ) != 0 ) {
428
+ #if ZEND_MM_ERROR
429
+ fprintf (stderr , "\nmunmap() failed: [%d] %s\n" , errno , strerror (errno ));
430
+ #endif
431
+ }
432
+ #endif
433
+ }
434
+
418
435
#ifndef HAVE_MREMAP
419
436
static void * zend_mm_mmap_fixed (void * addr , size_t size )
420
437
{
421
438
#ifdef _WIN32
422
- return VirtualAlloc (addr , size , MEM_COMMIT | MEM_RESERVE , PAGE_READWRITE );
439
+ void * ptr = VirtualAlloc (addr , size , MEM_COMMIT | MEM_RESERVE , PAGE_READWRITE );
440
+ if (ptr == NULL ) {
441
+ if (GetLastError () == ERROR_INVALID_ADDRESS ) {
442
+ zend_mm_munmap (ptr , size );
443
+ return NULL ;
444
+ }
445
+ #if ZEND_MM_ERROR
446
+ stderr_last_error ("VirtualAlloc(addr) failed" );
447
+ #endif
448
+ return NULL ;
449
+ }
450
+ EXPECTED (ptr == addr );
451
+ return ptr ;
423
452
#else
424
453
int flags = MAP_PRIVATE | MAP_ANON ;
425
454
#if defined(MAP_EXCL )
@@ -434,11 +463,7 @@ static void *zend_mm_mmap_fixed(void *addr, size_t size)
434
463
#endif
435
464
return NULL ;
436
465
} else if (ptr != addr ) {
437
- if (munmap (ptr , size ) != 0 ) {
438
- #if ZEND_MM_ERROR
439
- fprintf (stderr , "\nmunmap() failed: [%d] %s\n" , errno , strerror (errno ));
440
- #endif
441
- }
466
+ zend_mm_munmap (ptr , size );
442
467
return NULL ;
443
468
}
444
469
return ptr ;
@@ -450,10 +475,9 @@ static void *zend_mm_mmap(size_t size)
450
475
{
451
476
#ifdef _WIN32
452
477
void * ptr = VirtualAlloc (NULL , size , MEM_COMMIT | MEM_RESERVE , PAGE_READWRITE );
453
-
454
478
if (ptr == NULL ) {
455
479
#if ZEND_MM_ERROR
456
- stderr_last_error ("VirtualAlloc() failed" );
480
+ stderr_last_error ("VirtualAlloc(NULL ) failed" );
457
481
#endif
458
482
return NULL ;
459
483
}
@@ -482,23 +506,6 @@ static void *zend_mm_mmap(size_t size)
482
506
#endif
483
507
}
484
508
485
- static void zend_mm_munmap (void * addr , size_t size )
486
- {
487
- #ifdef _WIN32
488
- if (VirtualFree (addr , 0 , MEM_RELEASE ) == 0 ) {
489
- #if ZEND_MM_ERROR
490
- stderr_last_error ("VirtualFree() failed" );
491
- #endif
492
- }
493
- #else
494
- if (munmap (addr , size ) != 0 ) {
495
- #if ZEND_MM_ERROR
496
- fprintf (stderr , "\nmunmap() failed: [%d] %s\n" , errno , strerror (errno ));
497
- #endif
498
- }
499
- #endif
500
- }
501
-
502
509
/***********/
503
510
/* Bitmask */
504
511
/***********/
@@ -1846,11 +1853,7 @@ static zend_mm_heap *zend_mm_init(void)
1846
1853
1847
1854
if (UNEXPECTED (chunk == NULL )) {
1848
1855
#if ZEND_MM_ERROR
1849
- #ifdef _WIN32
1850
- stderr_last_error ("Can't initialize heap" );
1851
- #else
1852
- fprintf (stderr , "\nCan't initialize heap: [%d] %s\n" , errno , strerror (errno ));
1853
- #endif
1856
+ fprintf (stderr , "\nCan't initialize heap\n" );
1854
1857
#endif
1855
1858
return NULL ;
1856
1859
}
@@ -2978,11 +2981,7 @@ ZEND_API zend_mm_heap *zend_mm_startup_ex(const zend_mm_handlers *handlers, void
2978
2981
chunk = (zend_mm_chunk * )handlers -> chunk_alloc (& tmp_storage , ZEND_MM_CHUNK_SIZE , ZEND_MM_CHUNK_SIZE );
2979
2982
if (UNEXPECTED (chunk == NULL )) {
2980
2983
#if ZEND_MM_ERROR
2981
- #ifdef _WIN32
2982
- stderr_last_error ("Can't initialize heap" );
2983
- #else
2984
- fprintf (stderr , "\nCan't initialize heap: [%d] %s\n" , errno , strerror (errno ));
2985
- #endif
2984
+ fprintf (stderr , "\nCan't initialize heap\n" );
2986
2985
#endif
2987
2986
return NULL ;
2988
2987
}
@@ -3025,11 +3024,7 @@ ZEND_API zend_mm_heap *zend_mm_startup_ex(const zend_mm_handlers *handlers, void
3025
3024
if (!storage ) {
3026
3025
handlers -> chunk_free (& tmp_storage , chunk , ZEND_MM_CHUNK_SIZE );
3027
3026
#if ZEND_MM_ERROR
3028
- #ifdef _WIN32
3029
- stderr_last_error ("Can't initialize heap" );
3030
- #else
3031
- fprintf (stderr , "\nCan't initialize heap: [%d] %s\n" , errno , strerror (errno ));
3032
- #endif
3027
+ fprintf (stderr , "\nCan't initialize heap\n" );
3033
3028
#endif
3034
3029
return NULL ;
3035
3030
}
0 commit comments