Skip to content

Commit a64231a

Browse files
committed
Move/refactor heavily changed zend_alloc functions first
1 parent b4fb664 commit a64231a

File tree

1 file changed

+36
-45
lines changed

1 file changed

+36
-45
lines changed

Zend/zend_alloc.c

Lines changed: 36 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -416,36 +416,22 @@ stderr_last_error(char *msg)
416416
/* OS Allocation */
417417
/*****************/
418418

419-
#ifndef HAVE_MREMAP
420-
static void *zend_mm_mmap_fixed(void *addr, size_t size)
419+
static void zend_mm_munmap(void *addr, size_t size)
421420
{
422421
#ifdef _WIN32
423-
return VirtualAlloc(addr, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
424-
#else
425-
int flags = MAP_PRIVATE | MAP_ANON;
426-
#if defined(MAP_EXCL)
427-
flags |= MAP_FIXED | MAP_EXCL;
428-
#endif
429-
/* MAP_FIXED leads to discarding of the old mapping, so it can't be used. */
430-
void *ptr = mmap(addr, size, PROT_READ | PROT_WRITE, flags /*| MAP_POPULATE | MAP_HUGETLB*/, ZEND_MM_FD, 0);
431-
432-
if (ptr == MAP_FAILED) {
433-
#if ZEND_MM_ERROR && !defined(MAP_EXCL)
434-
fprintf(stderr, "\nmmap() failed: [%d] %s\n", errno, strerror(errno));
422+
if (VirtualFree(addr, 0, MEM_RELEASE) == 0) {
423+
#if ZEND_MM_ERROR
424+
stderr_last_error("VirtualFree() failed");
435425
#endif
436-
return NULL;
437-
} else if (ptr != addr) {
438-
if (munmap(ptr, size) != 0) {
426+
}
427+
#else
428+
if (munmap(addr, size) != 0) {
439429
#if ZEND_MM_ERROR
440-
fprintf(stderr, "\nmunmap() failed: [%d] %s\n", errno, strerror(errno));
430+
fprintf(stderr, "\nmunmap() failed: [%d] %s\n", errno, strerror(errno));
441431
#endif
442-
}
443-
return NULL;
444432
}
445-
return ptr;
446433
#endif
447434
}
448-
#endif
449435

450436
static void *zend_mm_mmap(size_t size)
451437
{
@@ -483,22 +469,32 @@ static void *zend_mm_mmap(size_t size)
483469
#endif
484470
}
485471

486-
static void zend_mm_munmap(void *addr, size_t size)
472+
#ifndef HAVE_MREMAP
473+
static void *zend_mm_mmap_fixed(void *addr, size_t size)
487474
{
488475
#ifdef _WIN32
489-
if (VirtualFree(addr, 0, MEM_RELEASE) == 0) {
490-
#if ZEND_MM_ERROR
491-
stderr_last_error("VirtualFree() failed");
492-
#endif
493-
}
476+
return VirtualAlloc(addr, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
494477
#else
495-
if (munmap(addr, size) != 0) {
496-
#if ZEND_MM_ERROR
497-
fprintf(stderr, "\nmunmap() failed: [%d] %s\n", errno, strerror(errno));
478+
int flags = MAP_PRIVATE | MAP_ANON;
479+
#if defined(MAP_EXCL)
480+
flags |= MAP_FIXED | MAP_EXCL;
481+
#endif
482+
/* MAP_FIXED leads to discarding of the old mapping, so it can't be used. */
483+
void *ptr = mmap(addr, size, PROT_READ | PROT_WRITE, flags /*| MAP_POPULATE | MAP_HUGETLB*/, ZEND_MM_FD, 0);
484+
485+
if (ptr == MAP_FAILED) {
486+
#if ZEND_MM_ERROR && !defined(MAP_EXCL)
487+
fprintf(stderr, "\nmmap() failed: [%d] %s\n", errno, strerror(errno));
498488
#endif
489+
return NULL;
490+
} else if (ptr != addr) {
491+
zend_mm_munmap(ptr, size);
492+
return NULL;
499493
}
494+
return ptr;
500495
#endif
501496
}
497+
#endif
502498

503499
/***********/
504500
/* Bitmask */
@@ -668,14 +664,7 @@ static void *zend_mm_chunk_alloc_int(size_t size, size_t alignment)
668664

669665
if (ptr == NULL) {
670666
return NULL;
671-
} else if (ZEND_MM_ALIGNED_OFFSET(ptr, alignment) == 0) {
672-
#ifdef MADV_HUGEPAGE
673-
if (zend_mm_use_huge_pages) {
674-
madvise(ptr, size, MADV_HUGEPAGE);
675-
}
676-
#endif
677-
return ptr;
678-
} else {
667+
} else if (ZEND_MM_ALIGNED_OFFSET(ptr, alignment) != 0) {
679668
size_t offset;
680669

681670
/* chunk has to be aligned */
@@ -702,14 +691,16 @@ static void *zend_mm_chunk_alloc_int(size_t size, size_t alignment)
702691
if (alignment > REAL_PAGE_SIZE) {
703692
zend_mm_munmap((char*)ptr + size, alignment - REAL_PAGE_SIZE);
704693
}
705-
# ifdef MADV_HUGEPAGE
706-
if (zend_mm_use_huge_pages) {
707-
madvise(ptr, size, MADV_HUGEPAGE);
708-
}
709-
# endif
710694
#endif
711-
return ptr;
712695
}
696+
697+
#ifdef MADV_HUGEPAGE
698+
if (zend_mm_use_huge_pages) {
699+
madvise(ptr, size, MADV_HUGEPAGE);
700+
}
701+
#endif
702+
703+
return ptr;
713704
}
714705

715706
static void *zend_mm_chunk_alloc(zend_mm_heap *heap, size_t size, size_t alignment)

0 commit comments

Comments
 (0)