diff options
author | zherczeg <zherczeg@6239d852-aaf2-0410-a92c-79f79f948069> | 2018-11-25 17:11:52 +0000 |
---|---|---|
committer | zherczeg <zherczeg@6239d852-aaf2-0410-a92c-79f79f948069> | 2018-11-25 17:11:52 +0000 |
commit | b815780f1f59e9a671b67515ce02e2dcbe857603 (patch) | |
tree | ad9043473d3da67f7cb7381efeaa9adcc019a47f | |
parent | 5e1125166dfb548b2ee6501140923e63abb7662e (diff) | |
download | pcre2-b815780f1f59e9a671b67515ce02e2dcbe857603.tar.gz |
Improve MAP_JIT flag usage on MacOS. Patch by Rich Siegel.
git-svn-id: svn://vcs.exim.org/pcre2/code/trunk@1046 6239d852-aaf2-0410-a92c-79f79f948069
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | src/sljit/sljitExecAllocator.c | 38 |
2 files changed, 37 insertions, 3 deletions
@@ -83,6 +83,8 @@ compiler complains). 20. Added "fork" support for VMS to pcre2grep, for running an external program via a string callout. +21. Improve MAP_JIT flag usage on MacOS. Patch by Rich Siegel. + Version 10.32 10-September-2018 ------------------------------- diff --git a/src/sljit/sljitExecAllocator.c b/src/sljit/sljitExecAllocator.c index 7c18578..d056561 100644 --- a/src/sljit/sljitExecAllocator.c +++ b/src/sljit/sljitExecAllocator.c @@ -94,6 +94,38 @@ static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size) #else +#ifdef MAP_JIT + +static SLJIT_INLINE int get_map_jit_flag() +{ +#ifdef TARGET_OS_MAC + /* On macOS systems, returns MAP_JIT if it is defined _and_ we're running on a version + of macOS where it's OK to have more than one JIT block. On non-macOS systems, returns + MAP_JIT if it is defined. */ + + static dispatch_once_t _inited; + static int map_jit_flag; + + dispatch_once(&_inited, + ^() { + struct utsname name; + + uname(&name); + + /* Kernel version for 10.14.0 (Mojave) */ + if (atoi(name.release) >= 18) + map_jit_flag = MAP_JIT; + } + ); + + return map_jit_flag; +#else /* !TARGET_OS_MAC */ + return MAP_JIT; +#endif /* TARGET_OS_MAC */ +} + +#endif /* MAP_JIT */ + static SLJIT_INLINE void* alloc_chunk(sljit_uw size) { void *retval; @@ -103,17 +135,17 @@ static SLJIT_INLINE void* alloc_chunk(sljit_uw size) int flags = MAP_PRIVATE | MAP_ANON; #ifdef MAP_JIT - flags |= MAP_JIT; + flags |= get_map_jit_flag(); #endif retval = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, flags, -1, 0); -#else +#else /* !MAP_ANON */ if (dev_zero < 0) { if (open_dev_zero()) return NULL; } retval = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, dev_zero, 0); -#endif +#endif /* MAP_ANON */ return (retval != MAP_FAILED) ? retval : NULL; } |