summaryrefslogtreecommitdiffstats
path: root/jemalloc/include
diff options
context:
space:
mode:
authorJason Evans <je@fb.com>2011-03-19 02:10:31 (GMT)
committerJason Evans <je@fb.com>2011-03-19 02:10:31 (GMT)
commit763baa6cfcc8a9df9d3b7f676b2193ac7cd5ef51 (patch)
treea7bbdaca10c8111dfb7a39d7ec97ec1c8132b415 /jemalloc/include
parent9a8fc41bb9752129510f3387f5c20cb798ff6b1a (diff)
downloadjemalloc-763baa6cfcc8a9df9d3b7f676b2193ac7cd5ef51.zip
jemalloc-763baa6cfcc8a9df9d3b7f676b2193ac7cd5ef51.tar.gz
jemalloc-763baa6cfcc8a9df9d3b7f676b2193ac7cd5ef51.tar.bz2
Add atomic operation support for OS X.
Diffstat (limited to 'jemalloc/include')
-rw-r--r--jemalloc/include/jemalloc/internal/atomic.h28
-rw-r--r--jemalloc/include/jemalloc/internal/jemalloc_internal.h.in4
-rw-r--r--jemalloc/include/jemalloc/jemalloc_defs.h.in6
3 files changed, 38 insertions, 0 deletions
diff --git a/jemalloc/include/jemalloc/internal/atomic.h b/jemalloc/include/jemalloc/internal/atomic.h
index 43faeaf..089affa 100644
--- a/jemalloc/include/jemalloc/internal/atomic.h
+++ b/jemalloc/include/jemalloc/internal/atomic.h
@@ -49,6 +49,20 @@ atomic_sub_uint64(uint64_t *p, uint64_t x)
return (__sync_sub_and_fetch(p, x));
}
+#elif (defined(JEMALLOC_OSATOMIC))
+JEMALLOC_INLINE uint64_t
+atomic_add_uint64(uint64_t *p, uint64_t x)
+{
+
+ return (OSAtomicAdd64((int64_t)x, (int64_t *)p));
+}
+
+JEMALLOC_INLINE uint64_t
+atomic_sub_uint64(uint64_t *p, uint64_t x)
+{
+
+ return (OSAtomicAdd64(-((int64_t)x), (int64_t *)p));
+}
#else
# error "Missing implementation for 64-bit atomic operations"
#endif
@@ -68,6 +82,20 @@ atomic_sub_uint32(uint32_t *p, uint32_t x)
return (__sync_sub_and_fetch(p, x));
}
+#elif (defined(JEMALLOC_OSATOMIC))
+JEMALLOC_INLINE uint32_t
+atomic_add_uint32(uint32_t *p, uint32_t x)
+{
+
+ return (OSAtomicAdd32((int32_t)x, (int32_t *)p));
+}
+
+JEMALLOC_INLINE uint32_t
+atomic_sub_uint32(uint32_t *p, uint32_t x)
+{
+
+ return (OSAtomicAdd32(-((int32_t)x), (int32_t *)p));
+}
#else
# error "Missing implementation for 32-bit atomic operations"
#endif
diff --git a/jemalloc/include/jemalloc/internal/jemalloc_internal.h.in b/jemalloc/include/jemalloc/internal/jemalloc_internal.h.in
index 90cd604..f660bc8 100644
--- a/jemalloc/include/jemalloc/internal/jemalloc_internal.h.in
+++ b/jemalloc/include/jemalloc/internal/jemalloc_internal.h.in
@@ -33,6 +33,10 @@
#define JEMALLOC_MANGLE
#include "../jemalloc@install_suffix@.h"
+#ifdef JEMALLOC_OSATOMIC
+#include <libkern/OSAtomic.h>
+#endif
+
#ifdef JEMALLOC_ZONE
#include <mach/mach_error.h>
#include <mach/mach_init.h>
diff --git a/jemalloc/include/jemalloc/jemalloc_defs.h.in b/jemalloc/include/jemalloc/jemalloc_defs.h.in
index d669841..c08c5a2 100644
--- a/jemalloc/include/jemalloc/jemalloc_defs.h.in
+++ b/jemalloc/include/jemalloc/jemalloc_defs.h.in
@@ -24,6 +24,12 @@
*/
#undef CPU_SPINWAIT
+/*
+ * Defined if OSAtomic*() functions are available, as provided by Darwin, and
+ * documented in the atomic(3) manual page.
+ */
+#undef JEMALLOC_OSATOMIC
+
/* Defined if __attribute__((...)) syntax is supported. */
#undef JEMALLOC_HAVE_ATTR
#ifdef JEMALLOC_HAVE_ATTR