2929#include <stdlib.h>
3030#include <sys/mman.h>
3131
32+ #ifdef __APPLE__
33+ #include <mach/vm_statistics.h>
34+ #endif
35+
3236#if defined(MAP_ANON ) && !defined(MAP_ANONYMOUS )
3337# define MAP_ANONYMOUS MAP_ANON
3438#endif
3943static int create_segments (size_t requested_size , zend_shared_segment * * * shared_segments_p , int * shared_segments_count , char * * error_in )
4044{
4145 zend_shared_segment * shared_segment ;
42- int flags = PROT_READ | PROT_WRITE ;
46+ int flags = PROT_READ | PROT_WRITE , fd = -1 ;
4347 void * p ;
4448#ifdef PROT_MPROTECT
45- flags |= PROT_MPROTECT (PROT_EXEC );
49+ flags |= PROT_MPROTECT (PROT_EXEC );
50+ #endif
51+ #ifdef VM_MAKE_TAG
52+ /* allows tracking segments via tools such as vmmap */
53+ fd = VM_MAKE_TAG (251 );
4654#endif
4755#ifdef MAP_HUGETLB
4856 size_t huge_page_size = 2 * 1024 * 1024 ;
@@ -62,34 +70,34 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_
6270 /* to got HUGE PAGES in low 32-bit address we have to reserve address
6371 space and then remap it using MAP_HUGETLB */
6472
65- p = mmap (NULL , requested_size , flags , MAP_SHARED |MAP_ANONYMOUS |MAP_32BIT , -1 , 0 );
73+ p = mmap (NULL , requested_size , flags , MAP_SHARED |MAP_ANONYMOUS |MAP_32BIT , fd , 0 );
6674 if (p != MAP_FAILED ) {
6775 munmap (p , requested_size );
6876 p = (void * )(ZEND_MM_ALIGNED_SIZE_EX ((ptrdiff_t )p , huge_page_size ));
6977 p = mmap (p , requested_size , flags , MAP_SHARED |MAP_ANONYMOUS |MAP_32BIT |MAP_HUGETLB |MAP_FIXED , -1 , 0 );
7078 if (p != MAP_FAILED ) {
7179 goto success ;
7280 } else {
73- p = mmap (NULL , requested_size , flags , MAP_SHARED |MAP_ANONYMOUS |MAP_32BIT , -1 , 0 );
81+ p = mmap (NULL , requested_size , flags , MAP_SHARED |MAP_ANONYMOUS |MAP_32BIT , fd , 0 );
7482 if (p != MAP_FAILED ) {
7583 goto success ;
7684 }
7785 }
7886 }
7987# endif
80- p = mmap (0 , requested_size , flags , MAP_SHARED |MAP_ANONYMOUS |MAP_HUGETLB , -1 , 0 );
88+ p = mmap (0 , requested_size , flags , MAP_SHARED |MAP_ANONYMOUS |MAP_HUGETLB , fd , 0 );
8189 if (p != MAP_FAILED ) {
8290 goto success ;
8391 }
8492 }
8593#elif defined(PREFER_MAP_32BIT ) && defined(__x86_64__ ) && defined(MAP_32BIT )
86- p = mmap (NULL , requested_size , flags , MAP_SHARED |MAP_ANONYMOUS |MAP_32BIT , -1 , 0 );
94+ p = mmap (NULL , requested_size , flags , MAP_SHARED |MAP_ANONYMOUS |MAP_32BIT , fd , 0 );
8795 if (p != MAP_FAILED ) {
8896 goto success ;
8997 }
9098#endif
9199
92- p = mmap (0 , requested_size , flags , MAP_SHARED |MAP_ANONYMOUS , -1 , 0 );
100+ p = mmap (0 , requested_size , flags , MAP_SHARED |MAP_ANONYMOUS , fd , 0 );
93101 if (p == MAP_FAILED ) {
94102 * error_in = "mmap" ;
95103 return ALLOC_FAILURE ;
0 commit comments