29
29
#include <stdlib.h>
30
30
#include <sys/mman.h>
31
31
32
+ #ifdef __APPLE__
33
+ #include <mach/vm_statistics.h>
34
+ #endif
35
+
32
36
#if defined(MAP_ANON ) && !defined(MAP_ANONYMOUS )
33
37
# define MAP_ANONYMOUS MAP_ANON
34
38
#endif
39
43
static int create_segments (size_t requested_size , zend_shared_segment * * * shared_segments_p , int * shared_segments_count , char * * error_in )
40
44
{
41
45
zend_shared_segment * shared_segment ;
42
- int flags = PROT_READ | PROT_WRITE ;
46
+ int flags = PROT_READ | PROT_WRITE , fd = -1 ;
43
47
void * p ;
44
48
#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 );
46
54
#endif
47
55
#ifdef MAP_HUGETLB
48
56
size_t huge_page_size = 2 * 1024 * 1024 ;
@@ -62,34 +70,34 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_
62
70
/* to got HUGE PAGES in low 32-bit address we have to reserve address
63
71
space and then remap it using MAP_HUGETLB */
64
72
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 );
66
74
if (p != MAP_FAILED ) {
67
75
munmap (p , requested_size );
68
76
p = (void * )(ZEND_MM_ALIGNED_SIZE_EX ((ptrdiff_t )p , huge_page_size ));
69
77
p = mmap (p , requested_size , flags , MAP_SHARED |MAP_ANONYMOUS |MAP_32BIT |MAP_HUGETLB |MAP_FIXED , -1 , 0 );
70
78
if (p != MAP_FAILED ) {
71
79
goto success ;
72
80
} 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 );
74
82
if (p != MAP_FAILED ) {
75
83
goto success ;
76
84
}
77
85
}
78
86
}
79
87
# 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 );
81
89
if (p != MAP_FAILED ) {
82
90
goto success ;
83
91
}
84
92
}
85
93
#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 );
87
95
if (p != MAP_FAILED ) {
88
96
goto success ;
89
97
}
90
98
#endif
91
99
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 );
93
101
if (p == MAP_FAILED ) {
94
102
* error_in = "mmap" ;
95
103
return ALLOC_FAILURE ;
0 commit comments