summaryrefslogtreecommitdiff
path: root/lib/asan/asan_mac.cc
diff options
context:
space:
mode:
authorAlexander Potapenko <glider@google.com>2013-07-16 09:29:48 +0000
committerAlexander Potapenko <glider@google.com>2013-07-16 09:29:48 +0000
commit31f78fda9c511f9ab4afc3494f54cb24450e28e6 (patch)
tree2675f267f7ccc54270af5685667b9464e4de77bd /lib/asan/asan_mac.cc
parentad2ae5464b3c0f947f72908671ba1e6d753855a5 (diff)
downloadcompiler-rt-31f78fda9c511f9ab4afc3494f54cb24450e28e6.tar.gz
compiler-rt-31f78fda9c511f9ab4afc3494f54cb24450e28e6.tar.bz2
compiler-rt-31f78fda9c511f9ab4afc3494f54cb24450e28e6.tar.xz
[ASan] Cache the OSX version to avoid calling sysctl() on every GetMacosVersion() call.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@186389 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/asan/asan_mac.cc')
-rw-r--r--lib/asan/asan_mac.cc17
1 files changed, 16 insertions, 1 deletions
diff --git a/lib/asan/asan_mac.cc b/lib/asan/asan_mac.cc
index f7845368..92008376 100644
--- a/lib/asan/asan_mac.cc
+++ b/lib/asan/asan_mac.cc
@@ -21,6 +21,7 @@
#include "asan_mapping.h"
#include "asan_stack.h"
#include "asan_thread.h"
+#include "sanitizer_common/sanitizer_atomic.h"
#include "sanitizer_common/sanitizer_libc.h"
#include <crt_externs.h> // for _NSGetArgv
@@ -52,7 +53,9 @@ void GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp) {
# endif // SANITIZER_WORDSIZE
}
-int GetMacosVersion() {
+MacosVersion cached_macos_version = MACOS_VERSION_UNINITIALIZED;
+
+MacosVersion GetMacosVersionInternal() {
int mib[2] = { CTL_KERN, KERN_OSRELEASE };
char version[100];
uptr len = 0, maxlen = sizeof(version) / sizeof(version[0]);
@@ -76,6 +79,18 @@ int GetMacosVersion() {
}
}
+MacosVersion GetMacosVersion() {
+ atomic_uint32_t *cache =
+ reinterpret_cast<atomic_uint32_t*>(&cached_macos_version);
+ MacosVersion result =
+ static_cast<MacosVersion>(atomic_load(cache, memory_order_acquire));
+ if (result == MACOS_VERSION_UNINITIALIZED) {
+ result = GetMacosVersionInternal();
+ atomic_store(cache, result, memory_order_release);
+ }
+ return result;
+}
+
bool PlatformHasDifferentMemcpyAndMemmove() {
// On OS X 10.7 memcpy() and memmove() are both resolved
// into memmove$VARIANT$sse42.