18 #ifndef PORT_ATOMIC_POINTER_H_ 19 #define PORT_ATOMIC_POINTER_H_ 22 #ifdef LEVELDB_ATOMIC_PRESENT 29 #include <libkern/OSAtomic.h> 32 #if defined(_M_X64) || defined(__x86_64__) 33 #define ARCH_CPU_X86_FAMILY 1 34 #elif defined(_M_IX86) || defined(__i386__) || defined(__i386) 35 #define ARCH_CPU_X86_FAMILY 1 36 #elif defined(__ARMEL__) 37 #define ARCH_CPU_ARM_FAMILY 1 38 #elif defined(__aarch64__) 39 #define ARCH_CPU_ARM64_FAMILY 1 40 #elif defined(__ppc__) || defined(__powerpc__) || defined(__powerpc64__) 41 #define ARCH_CPU_PPC_FAMILY 1 42 #elif defined(__mips__) 43 #define ARCH_CPU_MIPS_FAMILY 1 50 #if defined(LEVELDB_ATOMIC_PRESENT) 53 std::atomic<void*>
rep_;
58 return rep_.load(std::memory_order_acquire);
61 rep_.store(v, std::memory_order_release);
64 return rep_.load(std::memory_order_relaxed);
67 rep_.store(v, std::memory_order_relaxed);
75 #if defined(OS_WIN) && defined(COMPILER_MSVC) && defined(ARCH_CPU_X86_FAMILY) 78 #define LEVELDB_HAVE_MEMORY_BARRIER 81 #elif defined(OS_MACOSX) 82 inline void MemoryBarrier() {
85 #define LEVELDB_HAVE_MEMORY_BARRIER 88 #elif defined(ARCH_CPU_X86_FAMILY) && defined(__GNUC__) 89 inline void MemoryBarrier() {
92 __asm__ __volatile__(
"" : : :
"memory");
94 #define LEVELDB_HAVE_MEMORY_BARRIER 97 #elif defined(ARCH_CPU_X86_FAMILY) && defined(__SUNPRO_CC) 98 inline void MemoryBarrier() {
101 asm volatile(
"" : : :
"memory");
103 #define LEVELDB_HAVE_MEMORY_BARRIER 106 #elif defined(ARCH_CPU_ARM_FAMILY) && defined(__linux__) 107 typedef void (*LinuxKernelMemoryBarrierFunc)(void);
118 inline void MemoryBarrier() {
119 (*(LinuxKernelMemoryBarrierFunc)0xffff0fa0)();
121 #define LEVELDB_HAVE_MEMORY_BARRIER 124 #elif defined(ARCH_CPU_ARM64_FAMILY) 125 inline void MemoryBarrier() {
126 asm volatile(
"dmb sy" : : :
"memory");
128 #define LEVELDB_HAVE_MEMORY_BARRIER 131 #elif defined(ARCH_CPU_PPC_FAMILY) && defined(__GNUC__) 132 inline void MemoryBarrier() {
135 asm volatile(
"sync" : : :
"memory");
137 #define LEVELDB_HAVE_MEMORY_BARRIER 140 #elif defined(ARCH_CPU_MIPS_FAMILY) && defined(__GNUC__) 141 inline void MemoryBarrier() {
142 __asm__ __volatile__(
"sync" : : :
"memory");
144 #define LEVELDB_HAVE_MEMORY_BARRIER 149 #if defined(LEVELDB_HAVE_MEMORY_BARRIER) 170 #elif defined(__sparcv9) && defined(__GNUC__) 179 __asm__ __volatile__ (
180 "ldx [%[rep_]], %[val] \n\t" 181 "membar #LoadLoad|#LoadStore \n\t" 188 __asm__ __volatile__ (
189 "membar #LoadStore|#StoreStore \n\t" 190 "stx %[v], [%[rep_]] \n\t" 200 #elif defined(__ia64) && defined(__GNUC__) 209 __asm__ __volatile__ (
210 "ld8.acq %[val] = [%[rep_]] \n\t" 218 __asm__ __volatile__ (
219 "st8.rel [%[rep_]] = %[v] \n\t" 231 #error Please implement AtomicPointer for this platform. 236 #undef LEVELDB_HAVE_MEMORY_BARRIER 237 #undef ARCH_CPU_X86_FAMILY 238 #undef ARCH_CPU_ARM_FAMILY 239 #undef ARCH_CPU_ARM64_FAMILY 240 #undef ARCH_CPU_PPC_FAMILY 245 #endif // PORT_ATOMIC_POINTER_H_
Definition: autocompact_test.cc:11
Definition: port_example.h:75
void NoBarrier_Store(void *v)
Definition: port_win.cc:143
void Release_Store(void *v)
Definition: port_win.cc:135
void * Acquire_Load() const
Definition: port_win.cc:129
void * NoBarrier_Load() const
Definition: port_win.cc:139
int port
Definition: zmq_sub.py:37
intptr_t rep_
Definition: port_example.h:77