Move folly/experimental/AsymmetricMemoryBarrier.h
authorYedidya Feldblum <yfeldblum@fb.com>
Tue, 31 Oct 2017 00:57:54 +0000 (17:57 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Tue, 31 Oct 2017 01:22:58 +0000 (18:22 -0700)
Summary: [Folly] Move `folly/experimental/AsymmetricMemoryBarrier.h` to `folly/synchronization/AsymmetricMemoryBarrier.h`.

Reviewed By: Orvid

Differential Revision: D6180676

fbshipit-source-id: f4833318cd365181e202d5f379815e728fba168b

folly/Makefile.am
folly/experimental/AsymmetricMemoryBarrier.cpp [deleted file]
folly/experimental/AsymmetricMemoryBarrier.h [deleted file]
folly/experimental/TLRefCount.h
folly/experimental/hazptr/hazptr-impl.h
folly/synchronization/AsymmetricMemoryBarrier.cpp [new file with mode: 0644]
folly/synchronization/AsymmetricMemoryBarrier.h [new file with mode: 0644]

index d535a3b6681c0ce3fdf1adf09353c58653bca8b0..a351f990d26c38aae8387266eef2c97c94fe9470 100644 (file)
@@ -126,7 +126,6 @@ nobase_follyinclude_HEADERS = \
        Expected.h \
        concurrency/AtomicSharedPtr.h \
        concurrency/detail/AtomicSharedPtr-detail.h \
-       experimental/AsymmetricMemoryBarrier.h \
        experimental/AutoTimer.h \
        experimental/ThreadedRepeatingFunctionRunner.h \
        experimental/Bits.h \
@@ -423,6 +422,7 @@ nobase_follyinclude_HEADERS = \
        stats/MultiLevelTimeSeries.h \
        stats/TimeseriesHistogram-defs.h \
        stats/TimeseriesHistogram.h \
+       synchronization/AsymmetricMemoryBarrier.h \
        synchronization/CallOnce.h \
        synchronization/detail/AtomicUtils.h \
        system/MemoryMapping.h \
@@ -609,6 +609,7 @@ libfolly_la_SOURCES = \
        stats/Histogram.cpp \
        stats/MultiLevelTimeSeries.cpp \
        stats/TimeseriesHistogram.cpp \
+       synchronization/AsymmetricMemoryBarrier.cpp \
        system/MemoryMapping.cpp \
        system/Shell.cpp \
        system/ThreadName.cpp \
@@ -617,7 +618,6 @@ libfolly_la_SOURCES = \
        TimeoutQueue.cpp \
        Try.cpp \
        Uri.cpp \
-       experimental/AsymmetricMemoryBarrier.cpp \
        experimental/ThreadedRepeatingFunctionRunner.cpp \
        experimental/bser/Dump.cpp \
        experimental/bser/Load.cpp \
diff --git a/folly/experimental/AsymmetricMemoryBarrier.cpp b/folly/experimental/AsymmetricMemoryBarrier.cpp
deleted file mode 100644 (file)
index c8ae017..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2017 Facebook, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "AsymmetricMemoryBarrier.h"
-
-#include <folly/Exception.h>
-#include <folly/Indestructible.h>
-#include <folly/portability/SysMembarrier.h>
-#include <folly/portability/SysMman.h>
-#include <mutex>
-
-namespace folly {
-
-namespace {
-
-struct DummyPageCreator {
-  DummyPageCreator() {
-    get();
-  }
-
-  static void* get() {
-    static auto ptr = kIsLinux ? create() : nullptr;
-    return ptr;
-  }
-
- private:
-  static void* create() {
-    auto ptr = mmap(nullptr, 1, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-    checkUnixError(reinterpret_cast<ssize_t>(ptr), "mmap");
-
-    // Optimistically try to lock the page so it stays resident. Could make
-    // the heavy barrier faster.
-    auto r = mlock(ptr, 1);
-    if (r != 0) {
-      // Do nothing.
-    }
-
-    return ptr;
-  }
-};
-
-// Make sure dummy page is always initialized before shutdown.
-DummyPageCreator dummyPageCreator;
-
-void mprotectMembarrier() {
-  auto dummyPage = dummyPageCreator.get();
-
-  // This function is required to be safe to call on shutdown,
-  // so we must leak the mutex.
-  static Indestructible<std::mutex> mprotectMutex;
-  std::lock_guard<std::mutex> lg(*mprotectMutex);
-
-  int r = 0;
-
-  // We want to downgrade the page while it is resident. To do that, it must
-  // first be upgraded and forced to be resident.
-  r = mprotect(dummyPage, 1, PROT_READ | PROT_WRITE);
-  checkUnixError(r, "mprotect");
-
-  // Force the page to be resident. If it is already resident, almost no-op.
-  *static_cast<char*>(dummyPage) = 0;
-
-  // Downgrade the page. Forces a memory barrier in every core running any
-  // of the process's threads. On a sane platform.
-  r = mprotect(dummyPage, 1, PROT_READ);
-  checkUnixError(r, "mprotect");
-}
-} // namespace
-
-void asymmetricHeavyBarrier(AMBFlags flags) {
-  if (kIsLinux) {
-    static const bool useSysMembarrier = detail::sysMembarrierAvailable();
-    // sys_membarrier currently does not support EXPEDITED
-    if (useSysMembarrier && flags != AMBFlags::EXPEDITED) {
-      auto r = detail::sysMembarrier();
-      checkUnixError(r, "membarrier");
-    } else {
-      mprotectMembarrier();
-    }
-  } else {
-    std::atomic_thread_fence(std::memory_order_seq_cst);
-  }
-}
-} // namespace folly
diff --git a/folly/experimental/AsymmetricMemoryBarrier.h b/folly/experimental/AsymmetricMemoryBarrier.h
deleted file mode 100644 (file)
index c20157d..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2017 Facebook, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <atomic>
-
-#include <folly/portability/Asm.h>
-
-namespace folly {
-
-enum class AMBFlags {
-  NORMAL,
-  EXPEDITED,
-};
-
-FOLLY_ALWAYS_INLINE void asymmetricLightBarrier() {
-  if (kIsLinux) {
-    asm_volatile_memory();
-  } else {
-    std::atomic_thread_fence(std::memory_order_seq_cst);
-  }
-}
-
-void asymmetricHeavyBarrier(AMBFlags flags = AMBFlags::NORMAL);
-} // namespace folly
index 3e099ea8bbf4ff9344ed3074de34aff1ff65aec6..e8baf26e213be2ccae5ba5bb1b8f16d12dd5e2db 100644 (file)
@@ -16,7 +16,7 @@
 #pragma once
 
 #include <folly/ThreadLocal.h>
-#include <folly/experimental/AsymmetricMemoryBarrier.h>
+#include <folly/synchronization/AsymmetricMemoryBarrier.h>
 
 namespace folly {
 
index 82734d6f21c6092dc80a0db960a1a225ad40d567..a9f4c20b304f00b23b4a5a714c166315ff48e8a9 100644 (file)
@@ -59,8 +59,8 @@
 #endif
 
 #include <folly/concurrency/CacheLocality.h>
-#include <folly/experimental/AsymmetricMemoryBarrier.h>
 #include <folly/experimental/hazptr/debug.h>
+#include <folly/synchronization/AsymmetricMemoryBarrier.h>
 
 #include <mutex> // for thread caching
 #include <unordered_set> // for hash set in bulk reclamation
diff --git a/folly/synchronization/AsymmetricMemoryBarrier.cpp b/folly/synchronization/AsymmetricMemoryBarrier.cpp
new file mode 100644 (file)
index 0000000..c8ae017
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2017 Facebook, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "AsymmetricMemoryBarrier.h"
+
+#include <folly/Exception.h>
+#include <folly/Indestructible.h>
+#include <folly/portability/SysMembarrier.h>
+#include <folly/portability/SysMman.h>
+#include <mutex>
+
+namespace folly {
+
+namespace {
+
+struct DummyPageCreator {
+  DummyPageCreator() {
+    get();
+  }
+
+  static void* get() {
+    static auto ptr = kIsLinux ? create() : nullptr;
+    return ptr;
+  }
+
+ private:
+  static void* create() {
+    auto ptr = mmap(nullptr, 1, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+    checkUnixError(reinterpret_cast<ssize_t>(ptr), "mmap");
+
+    // Optimistically try to lock the page so it stays resident. Could make
+    // the heavy barrier faster.
+    auto r = mlock(ptr, 1);
+    if (r != 0) {
+      // Do nothing.
+    }
+
+    return ptr;
+  }
+};
+
+// Make sure dummy page is always initialized before shutdown.
+DummyPageCreator dummyPageCreator;
+
+void mprotectMembarrier() {
+  auto dummyPage = dummyPageCreator.get();
+
+  // This function is required to be safe to call on shutdown,
+  // so we must leak the mutex.
+  static Indestructible<std::mutex> mprotectMutex;
+  std::lock_guard<std::mutex> lg(*mprotectMutex);
+
+  int r = 0;
+
+  // We want to downgrade the page while it is resident. To do that, it must
+  // first be upgraded and forced to be resident.
+  r = mprotect(dummyPage, 1, PROT_READ | PROT_WRITE);
+  checkUnixError(r, "mprotect");
+
+  // Force the page to be resident. If it is already resident, almost no-op.
+  *static_cast<char*>(dummyPage) = 0;
+
+  // Downgrade the page. Forces a memory barrier in every core running any
+  // of the process's threads. On a sane platform.
+  r = mprotect(dummyPage, 1, PROT_READ);
+  checkUnixError(r, "mprotect");
+}
+} // namespace
+
+void asymmetricHeavyBarrier(AMBFlags flags) {
+  if (kIsLinux) {
+    static const bool useSysMembarrier = detail::sysMembarrierAvailable();
+    // sys_membarrier currently does not support EXPEDITED
+    if (useSysMembarrier && flags != AMBFlags::EXPEDITED) {
+      auto r = detail::sysMembarrier();
+      checkUnixError(r, "membarrier");
+    } else {
+      mprotectMembarrier();
+    }
+  } else {
+    std::atomic_thread_fence(std::memory_order_seq_cst);
+  }
+}
+} // namespace folly
diff --git a/folly/synchronization/AsymmetricMemoryBarrier.h b/folly/synchronization/AsymmetricMemoryBarrier.h
new file mode 100644 (file)
index 0000000..c20157d
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2017 Facebook, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <atomic>
+
+#include <folly/portability/Asm.h>
+
+namespace folly {
+
+enum class AMBFlags {
+  NORMAL,
+  EXPEDITED,
+};
+
+FOLLY_ALWAYS_INLINE void asymmetricLightBarrier() {
+  if (kIsLinux) {
+    asm_volatile_memory();
+  } else {
+    std::atomic_thread_fence(std::memory_order_seq_cst);
+  }
+}
+
+void asymmetricHeavyBarrier(AMBFlags flags = AMBFlags::NORMAL);
+} // namespace folly