All template params for PriorityMPMCQueue
[folly.git] / folly / detail / AtomicHashUtils.h
index adf6927ce377d963b0e9e5fc03dd1fe9ff25cacb..70d30ac2c62f32339a997c99975ed677c3d98784 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Facebook, Inc.
+ * 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.
  * limitations under the License.
  */
 
+#pragma once
+
+#include <thread>
+#include <folly/portability/Asm.h>
+
 // Some utilities used by AtomicHashArray and AtomicHashMap
 //
-// Note: no include guard; different -inl.h files include this and
-// undef it more than once in a translation unit.
 
-#if !(defined(__x86__) || defined(__i386__) || defined(__x86_64__))
-#define FOLLY_SPIN_WAIT(condition)                \
-   for (int counter = 0; condition; ++counter) {  \
-     if (counter < 10000) continue;               \
-     pthread_yield();                             \
-   }
-#else
-#define FOLLY_SPIN_WAIT(condition)              \
-  for (int counter = 0; condition; ++counter) { \
-    if (counter < 10000) {                      \
-      asm volatile("pause");                    \
-      continue;                                 \
-    }                                           \
-    pthread_yield();                            \
+namespace folly { namespace detail {
+
+template <typename Cond>
+void atomic_hash_spin_wait(Cond condition) {
+  constexpr size_t kPauseLimit = 10000;
+  for (size_t i = 0; condition(); ++i) {
+    if (i < kPauseLimit) {
+      folly::asm_pause();
+    } else {
+      std::this_thread::yield();
+    }
   }
-#endif
+}
+
+}} // namespace folly::detail