aboutsummaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorGravatar Vijay Pai <vpai@google.com>2015-03-13 11:12:10 -0700
committerGravatar Vijay Pai <vpai@google.com>2015-03-13 11:12:10 -0700
commitc97638b10bfd9de7a44d67c4c9431cb15968e28c (patch)
tree387e96c54fc6ce6c715ce1da46f01dd7c15cb3b9 /include
parent6bb4b7b2161f8c548d24f982fe8c050d25a2be92 (diff)
parent466423b15732af074d9010b09c579f3918fc225f (diff)
Merge pull request #1012 from dklempner/nobarrier
Add a no_barrier_load atomic operation.
Diffstat (limited to 'include')
-rw-r--r--include/grpc/support/atm_gcc_atomic.h1
-rw-r--r--include/grpc/support/atm_gcc_sync.h11
-rw-r--r--include/grpc/support/atm_win32.h5
3 files changed, 16 insertions, 1 deletions
diff --git a/include/grpc/support/atm_gcc_atomic.h b/include/grpc/support/atm_gcc_atomic.h
index 11d78b4097..65d3d0c60f 100644
--- a/include/grpc/support/atm_gcc_atomic.h
+++ b/include/grpc/support/atm_gcc_atomic.h
@@ -43,6 +43,7 @@ typedef gpr_intptr gpr_atm;
#define gpr_atm_full_barrier() (__atomic_thread_fence(__ATOMIC_SEQ_CST))
#define gpr_atm_acq_load(p) (__atomic_load_n((p), __ATOMIC_ACQUIRE))
+#define gpr_atm_no_barrier_load(p) (__atomic_load_n((p), __ATOMIC_RELAXED))
#define gpr_atm_rel_store(p, value) \
(__atomic_store_n((p), (gpr_intptr)(value), __ATOMIC_RELEASE))
diff --git a/include/grpc/support/atm_gcc_sync.h b/include/grpc/support/atm_gcc_sync.h
index e863bfd4c1..4955e4436f 100644
--- a/include/grpc/support/atm_gcc_sync.h
+++ b/include/grpc/support/atm_gcc_sync.h
@@ -40,9 +40,11 @@
typedef gpr_intptr gpr_atm;
+#define GPR_ATM_COMPILE_BARRIER_() __asm__ __volatile__("" : : : "memory")
+
#if defined(__i386) || defined(__x86_64__)
/* All loads are acquire loads and all stores are release stores. */
-#define GPR_ATM_LS_BARRIER_() __asm__ __volatile__("" : : : "memory")
+#define GPR_ATM_LS_BARRIER_() GPR_ATM_COMPILE_BARRIER_()
#else
#define GPR_ATM_LS_BARRIER_() gpr_atm_full_barrier()
#endif
@@ -55,12 +57,19 @@ static __inline gpr_atm gpr_atm_acq_load(const gpr_atm *p) {
return value;
}
+static __inline gpr_atm gpr_atm_no_barrier_load(const gpr_atm *p) {
+ gpr_atm value = *p;
+ GPR_ATM_COMPILE_BARRIER_();
+ return value;
+}
+
static __inline void gpr_atm_rel_store(gpr_atm *p, gpr_atm value) {
GPR_ATM_LS_BARRIER_();
*p = value;
}
#undef GPR_ATM_LS_BARRIER_
+#undef GPR_ATM_COMPILE_BARRIER_
#define gpr_atm_no_barrier_fetch_add(p, delta) \
gpr_atm_full_fetch_add((p), (delta))
diff --git a/include/grpc/support/atm_win32.h b/include/grpc/support/atm_win32.h
index 3b9113c28b..18bf372004 100644
--- a/include/grpc/support/atm_win32.h
+++ b/include/grpc/support/atm_win32.h
@@ -49,6 +49,11 @@ static __inline gpr_atm gpr_atm_acq_load(const gpr_atm *p) {
return result;
}
+static __inline gpr_atm gpr_atm_no_barrier_load(const gpr_atm *p) {
+ /* TODO(dklempner): Can we implement something better here? */
+ gpr_atm_acq_load(p);
+}
+
static __inline void gpr_atm_rel_store(gpr_atm *p, gpr_atm value) {
gpr_atm_full_barrier();
*p = value;