Go to the documentation of this file.
66# if (__STDC_VERSION__ < 201112L) || defined(__STDC_NO_ATOMICS__)
67# include <libkern/OSAtomic.h>
72# define PaUtil_FullMemoryBarrier() OSMemoryBarrier()
73# define PaUtil_ReadMemoryBarrier() OSMemoryBarrier()
74# define PaUtil_WriteMemoryBarrier() OSMemoryBarrier()
76# include <stdatomic.h>
77# define PaUtil_FullMemoryBarrier() atomic_thread_fence(memory_order_seq_cst)
78# define PaUtil_ReadMemoryBarrier() atomic_thread_fence(memory_order_acquire)
79# define PaUtil_WriteMemoryBarrier() atomic_thread_fence(memory_order_release)
81#elif defined(__GNUC__)
83# if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
84# define PaUtil_FullMemoryBarrier() __sync_synchronize()
85# define PaUtil_ReadMemoryBarrier() __sync_synchronize()
86# define PaUtil_WriteMemoryBarrier() __sync_synchronize()
91# elif defined( __ppc__ ) || defined( __powerpc__) || defined( __PPC__ )
92# define PaUtil_FullMemoryBarrier() asm volatile("sync":::"memory")
93# define PaUtil_ReadMemoryBarrier() asm volatile("sync":::"memory")
94# define PaUtil_WriteMemoryBarrier() asm volatile("sync":::"memory")
95# elif defined( __i386__ ) || defined( __i486__ ) || defined( __i586__ ) || \
96 defined( __i686__ ) || defined( __x86_64__ )
97# define PaUtil_FullMemoryBarrier() asm volatile("mfence":::"memory")
98# define PaUtil_ReadMemoryBarrier() asm volatile("lfence":::"memory")
99# define PaUtil_WriteMemoryBarrier() asm volatile("sfence":::"memory")
101# ifdef ALLOW_SMP_DANGERS
102# warning Memory barriers not defined on this system or system unknown
103# warning For SMP safety, you should fix this.
104# define PaUtil_FullMemoryBarrier()
105# define PaUtil_ReadMemoryBarrier()
106# define PaUtil_WriteMemoryBarrier()
108# error Memory barriers are not defined on this system. You can still compile by defining ALLOW_SMP_DANGERS, but SMP safety will not be guaranteed.
111#elif (_MSC_VER >= 1400) && !defined(_WIN32_WCE)
114# if defined(_M_ARM64)
116# define PaUtil_FullMemoryBarrier() __dmb(_ARM64_BARRIER_ISH)
117# define PaUtil_ReadMemoryBarrier() __dmb(_ARM64_BARRIER_ISHLD)
118# define PaUtil_WriteMemoryBarrier() __dmb(_ARM64_BARRIER_ISHST)
120# pragma intrinsic(_ReadWriteBarrier)
121# pragma intrinsic(_ReadBarrier)
122# pragma intrinsic(_WriteBarrier)
124# define PaUtil_FullMemoryBarrier() _ReadWriteBarrier()
125# define PaUtil_ReadMemoryBarrier() _ReadBarrier()
126# define PaUtil_WriteMemoryBarrier() _WriteBarrier()
128#elif defined(_WIN32_WCE)
129# define PaUtil_FullMemoryBarrier()
130# define PaUtil_ReadMemoryBarrier()
131# define PaUtil_WriteMemoryBarrier()
132#elif defined(_MSC_VER) || defined(__BORLANDC__)
133# define PaUtil_FullMemoryBarrier() _asm { lock add [esp], 0 }
134# define PaUtil_ReadMemoryBarrier() _asm { lock add [esp], 0 }
135# define PaUtil_WriteMemoryBarrier() _asm { lock add [esp], 0 }
137# ifdef ALLOW_SMP_DANGERS
138# warning Memory barriers not defined on this system or system unknown
139# warning For SMP safety, you should fix this.
140# define PaUtil_FullMemoryBarrier()
141# define PaUtil_ReadMemoryBarrier()
142# define PaUtil_WriteMemoryBarrier()
144# error Memory barriers are not defined on this system. You can still compile by defining ALLOW_SMP_DANGERS, but SMP safety will not be guaranteed.