diff --git a/folly/experimental/AsymmetricMemoryBarrier.cpp b/folly/experimental/AsymmetricMemoryBarrier.cpp index 55bec5f141bdc17d35d6347c1477b8d8dc9b4ac4..fc5b660141c3ebaa9b8bbd2b5a425ef98db8e343 100644 --- a/folly/experimental/AsymmetricMemoryBarrier.cpp +++ b/folly/experimental/AsymmetricMemoryBarrier.cpp @@ -32,8 +32,7 @@ struct DummyPageCreator { } static void* get() { - static auto ptr = - kIsLinux && !detail::sysMembarrierAvailable() ? create() : nullptr; + static auto ptr = kIsLinux ? create() : nullptr; return ptr; } @@ -81,10 +80,11 @@ void mprotectMembarrier() { } } -void asymmetricHeavyBarrier() { +void asymmetricHeavyBarrier(AMBFlags flags) { if (kIsLinux) { static const bool useSysMembarrier = detail::sysMembarrierAvailable(); - if (useSysMembarrier) { + // sys_membarrier currently does not support EXPEDITED + if (useSysMembarrier && flags != AMBFlags::EXPEDITED) { auto r = detail::sysMembarrier(); checkUnixError(r, "membarrier"); } else { diff --git a/folly/experimental/AsymmetricMemoryBarrier.h b/folly/experimental/AsymmetricMemoryBarrier.h index b8cf4a7e240ca5da85ba738b7fadffcd838d3cd0..faffa0b3712fc89d18b94cf2ef6ffb85bc346fea 100644 --- a/folly/experimental/AsymmetricMemoryBarrier.h +++ b/folly/experimental/AsymmetricMemoryBarrier.h @@ -22,6 +22,11 @@ namespace folly { +enum class AMBFlags { + NORMAL, + EXPEDITED, +}; + FOLLY_ALWAYS_INLINE void asymmetricLightBarrier() { if (kIsLinux) { asm_volatile_memory(); @@ -30,5 +35,5 @@ FOLLY_ALWAYS_INLINE void asymmetricLightBarrier() { } } -void asymmetricHeavyBarrier(); +void asymmetricHeavyBarrier(AMBFlags flags = AMBFlags::NORMAL); }