summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid CARLIER <devnexen@gmail.com>2021-01-20 20:03:56 +0000
committerNikita Popov <nikita.ppv@gmail.com>2021-01-26 10:51:33 +0100
commit4414fd93d06490e726dc04814ba412822170b712 (patch)
tree4405f0a4c557dd611e7a4aa462425263193a039b
parent5a0e4067b606d0d1b1b8c1825b5397abbfd718d4 (diff)
downloadphp-git-4414fd93d06490e726dc04814ba412822170b712.tar.gz
Distinguishing opcache SHM on stats tools for Mac
Closes GH-6628.
-rw-r--r--ext/opcache/shared_alloc_mmap.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/ext/opcache/shared_alloc_mmap.c b/ext/opcache/shared_alloc_mmap.c
index 3d2884e948..389c79114a 100644
--- a/ext/opcache/shared_alloc_mmap.c
+++ b/ext/opcache/shared_alloc_mmap.c
@@ -29,6 +29,10 @@
#include <stdlib.h>
#include <sys/mman.h>
+#ifdef __APPLE__
+#include <mach/vm_statistics.h>
+#endif
+
#if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
# define MAP_ANONYMOUS MAP_ANON
#endif
@@ -39,10 +43,14 @@
static int create_segments(size_t requested_size, zend_shared_segment ***shared_segments_p, int *shared_segments_count, char **error_in)
{
zend_shared_segment *shared_segment;
- int flags = PROT_READ | PROT_WRITE;
+ int flags = PROT_READ | PROT_WRITE, fd = -1;
void *p;
#ifdef PROT_MPROTECT
- flags |= PROT_MPROTECT(PROT_EXEC);
+ flags |= PROT_MPROTECT(PROT_EXEC);
+#endif
+#ifdef VM_MAKE_TAG
+ /* allows tracking segments via tools such as vmmap */
+ fd = VM_MAKE_TAG(251);
#endif
#ifdef MAP_HUGETLB
size_t huge_page_size = 2 * 1024 * 1024;
@@ -62,7 +70,7 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_
/* to got HUGE PAGES in low 32-bit address we have to reserve address
space and then remap it using MAP_HUGETLB */
- p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0);
+ p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, fd, 0);
if (p != MAP_FAILED) {
munmap(p, requested_size);
p = (void*)(ZEND_MM_ALIGNED_SIZE_EX((ptrdiff_t)p, huge_page_size));
@@ -70,26 +78,26 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_
if (p != MAP_FAILED) {
goto success;
} else {
- p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0);
+ p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, fd, 0);
if (p != MAP_FAILED) {
goto success;
}
}
}
# endif
- p = mmap(0, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0);
+ p = mmap(0, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_HUGETLB, fd, 0);
if (p != MAP_FAILED) {
goto success;
}
}
#elif defined(PREFER_MAP_32BIT) && defined(__x86_64__) && defined(MAP_32BIT)
- p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0);
+ p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, fd, 0);
if (p != MAP_FAILED) {
goto success;
}
#endif
- p = mmap(0, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
+ p = mmap(0, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS, fd, 0);
if (p == MAP_FAILED) {
*error_in = "mmap";
return ALLOC_FAILURE;