summaryrefslogtreecommitdiffstats
path: root/sys/amd64/include/atomic.h
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2015-07-08 18:12:24 +0000
committerkib <kib@FreeBSD.org>2015-07-08 18:12:24 +0000
commitc17f8bfdd50cd481c229672bc267cb3c845ace07 (patch)
treebcad6726cce83587071eccc899bb9aa9ec819f44 /sys/amd64/include/atomic.h
parent52af6a67b662366f80816c510628a1be8fd2ba0c (diff)
downloadFreeBSD-src-c17f8bfdd50cd481c229672bc267cb3c845ace07.zip
FreeBSD-src-c17f8bfdd50cd481c229672bc267cb3c845ace07.tar.gz
Add the atomic_thread_fence() family of functions with intent to
provide a semantic defined by the C11 fences with corresponding memory_order. atomic_thread_fence_acq() gives r | r, w, where r and w are read and write accesses, and | denotes the fence itself. atomic_thread_fence_rel() is r, w | w. atomic_thread_fence_acq_rel() is the combination of the acquire and release in single operation. Note that reads after the acq+rel fence could be made visible before writes preceeding the fence. atomic_thread_fence_seq_cst() orders all accesses before/after the fence, and the fence itself is globally ordered against other sequentially consistent atomic operations. Reviewed by: alc Discussed with: bde Sponsored by: The FreeBSD Foundation MFC after: 3 weeks
Diffstat (limited to 'sys/amd64/include/atomic.h')
-rw-r--r--sys/amd64/include/atomic.h32
1 files changed, 32 insertions, 0 deletions
diff --git a/sys/amd64/include/atomic.h b/sys/amd64/include/atomic.h
index 6d5c6b6..7892d51 100644
--- a/sys/amd64/include/atomic.h
+++ b/sys/amd64/include/atomic.h
@@ -84,6 +84,10 @@ u_int atomic_fetchadd_int(volatile u_int *p, u_int v);
u_long atomic_fetchadd_long(volatile u_long *p, u_long v);
int atomic_testandset_int(volatile u_int *p, u_int v);
int atomic_testandset_long(volatile u_long *p, u_int v);
+void atomic_thread_fence_acq(void);
+void atomic_thread_fence_acq_rel(void);
+void atomic_thread_fence_rel(void);
+void atomic_thread_fence_seq_cst(void);
#define ATOMIC_LOAD(TYPE) \
u_##TYPE atomic_load_acq_##TYPE(volatile u_##TYPE *p)
@@ -328,6 +332,34 @@ atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v) \
} \
struct __hack
+static __inline void
+atomic_thread_fence_acq(void)
+{
+
+ __compiler_membar();
+}
+
+static __inline void
+atomic_thread_fence_rel(void)
+{
+
+ __compiler_membar();
+}
+
+static __inline void
+atomic_thread_fence_acq_rel(void)
+{
+
+ __compiler_membar();
+}
+
+static __inline void
+atomic_thread_fence_seq_cst(void)
+{
+
+ __storeload_barrier();
+}
+
#endif /* KLD_MODULE || !__GNUCLIKE_ASM */
ATOMIC_ASM(set, char, "orb %b1,%0", "iq", v);
OpenPOWER on IntegriCloud