Fix copyright lines
[folly.git] / folly / experimental / EventCount.h
index a9feddfd83f8228320be48c305d596957e9d62fc..ee2f697f11b2619cb1363a3b67f463f6b3f5a8f5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016 Facebook, Inc.
+ * Copyright 2012-present Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 #pragma once
 
-#include <syscall.h>
-#include <linux/futex.h>
-#include <climits>
 #include <atomic>
+#include <climits>
 #include <thread>
+
 #include <glog/logging.h>
 
-#include <folly/Bits.h>
 #include <folly/Likely.h>
+#include <folly/detail/Futex.h>
+#include <folly/lang/Bits.h>
 #include <folly/portability/SysTime.h>
 #include <folly/portability/Unistd.h>
 
-
 namespace folly {
 
-namespace detail {
-
-inline int futex(int* uaddr, int op, int val, const timespec* timeout,
-                 int* uaddr2, int val3) noexcept {
-  return syscall(SYS_futex, uaddr, op, val, timeout, uaddr2, val3);
-}
-
-}  // namespace detail
-
 /**
  * Event count: a condition variable for lock free algorithms.
  *
@@ -125,6 +115,8 @@ class EventCount {
   static_assert(sizeof(int) == 4, "bad platform");
   static_assert(sizeof(uint32_t) == 4, "bad platform");
   static_assert(sizeof(uint64_t) == 8, "bad platform");
+  static_assert(sizeof(std::atomic<uint64_t>) == 8, "bad platform");
+  static_assert(sizeof(detail::Futex<std::atomic>) == 4, "bad platform");
 
   static constexpr size_t kEpochOffset = kIsLittleEndian ? 1 : 0;
 
@@ -150,8 +142,8 @@ inline void EventCount::notifyAll() noexcept {
 inline void EventCount::doNotify(int n) noexcept {
   uint64_t prev = val_.fetch_add(kAddEpoch, std::memory_order_acq_rel);
   if (UNLIKELY(prev & kWaiterMask)) {
-    detail::futex(reinterpret_cast<int*>(&val_) + kEpochOffset,
-                  FUTEX_WAKE, n, nullptr, nullptr, 0);
+    (reinterpret_cast<detail::Futex<std::atomic>*>(&val_) + kEpochOffset)
+        ->futexWake(n);
   }
 }
 
@@ -170,8 +162,8 @@ inline void EventCount::cancelWait() noexcept {
 
 inline void EventCount::wait(Key key) noexcept {
   while ((val_.load(std::memory_order_acquire) >> kEpochShift) == key.epoch_) {
-    detail::futex(reinterpret_cast<int*>(&val_) + kEpochOffset,
-                  FUTEX_WAIT, key.epoch_, nullptr, nullptr, 0);
+    (reinterpret_cast<detail::Futex<std::atomic>*>(&val_) + kEpochOffset)
+        ->futexWait(key.epoch_);
   }
   // memory_order_relaxed would suffice for correctness, but the faster
   // #waiters gets to 0, the less likely it is that we'll do spurious wakeups
@@ -182,7 +174,9 @@ inline void EventCount::wait(Key key) noexcept {
 
 template <class Condition>
 void EventCount::await(Condition condition) {
-  if (condition()) return;  // fast path
+  if (condition()) {
+    return; // fast path
+  }
 
   // condition() is the only thing that may throw, everything else is
   // noexcept, so we can hoist the try/catch block outside of the loop
@@ -202,4 +196,4 @@ void EventCount::await(Condition condition) {
   }
 }
 
-}  // namespace folly
+} // namespace folly