-
Type: Improvement
-
Resolution: Duplicate
-
Priority: Major - P3
-
None
-
Affects Version/s: None
-
Component/s: None
-
None
-
Not Needed
It should be possible provide implementations of the following section of gcc.h in terms of C11 intrinsics given a sufficiently new version of GCC:
Doing so would make the code more portable. In particular, we would like to be able to target both -march=z9-109 -mtune=z10 and -march=z196 -mtune=zEC12 in MongoDB 3.4, which have different barrier instructions, but there is no preprocessor define which distinguishes these settings.
We would need to find the appropriate incantation for each of
- WT_PAUSE
- WT_BARRIER
- WT_WRITE_BARRIER
- WT_READ_BARRIER
- WT_FULL_BARRIER
The following table contains a proposed mapping from the x86 primitives to the C11 equivalent.
macro | x86 | C11 proposal |
---|---|---|
WT_BARRIER | __asm__ volatile("" ::: "memory") |
atomic_signal_fence(memory_order_acq_rel) |
WT_READ_BARRIER | __asm__ volatile ("lfence" ::: "memory" |
atomic_thread_fence(memory_order_acquire) |
WT_WRITE_BARRIER | __asm__ volatile ("sfence" ::: "memory" |
atomic_thread_fence(memory_order_release) |
WT_FULL_BARRIER | __asm__ volatile ("mfence" ::: "memory") |
atomic_thread_fence(memory_order_acq_rel) |
These seem to be the only options, in terms of API calls, because all of the other C11 atomic operations act on specific memory addresses - only atomic_signal_fence and atomic_thread_fence do not.