/*
- * 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_volatile_pause();
+ } else {
+ std::this_thread::yield();
+ }
}
-#endif
+}
+
+} // namespace detail
+} // namespace folly