21 #include <condition_variable> 26 namespace atomic_notification {
40 : std::cv_status::no_timeout;
44 : std::cv_status::no_timeout;
50 template <
template <
typename...>
class Atom,
typename...
Args>
52 const Atom<std::uint32_t, Args...>* atomic,
58 template <
template <
typename...>
class Atom,
typename Integer,
typename...
Args>
60 static_assert(!std::is_same<Integer, std::uint32_t>{},
"");
62 atomic, -1, [&] {
return atomic->load() == expected; }, [] {});
66 template <
typename...>
class Atom,
71 const Atom<std::uint32_t, Args...>* atomic,
73 const std::chrono::time_point<Clock, Duration>& deadline) {
78 template <
typename...>
class Atom,
84 const Atom<Integer, Args...>* atomic,
86 const std::chrono::time_point<Clock, Duration>& deadline) {
87 static_assert(!std::is_same<Integer, std::uint32_t>{},
"");
89 atomic, -1, [&] { return atomic->load() == expected; }, [] {}, deadline));
92 template <
template <
typename...>
class Atom,
typename...
Args>
98 template <
template <
typename...>
class Atom,
typename Integer,
typename...
Args>
100 static_assert(!std::is_same<Integer, std::uint32_t>{},
"");
101 parkingLot.
unpark(atomic, [&](
const auto&
data) {
107 template <
template <
typename...>
class Atom,
typename Integer,
typename...
Args>
113 template <
template <
typename...>
class Atom,
typename Integer,
typename...
Args>
115 static_assert(!std::is_same<Integer, std::uint32_t>{},
"");
116 parkingLot.
unpark(atomic, [&](
const auto&
data) {
124 template <
typename Integer>
129 template <
typename Integer,
typename Clock,
typename Duration>
131 const std::atomic<Integer>* atomic,
133 const std::chrono::time_point<Clock, Duration>& deadline) {
135 atomic, expected, deadline);
138 template <
typename Integer>
143 template <
typename Integer>
void atomic_notify_one_impl(const Atom< std::uint32_t, Args... > *atomic)
void unpark(const Key key, Unparker &&func)
Atom< std::uint32_t > Futex
ParkResult park(const Key key, D &&data, ToPark &&toPark, PreWait &&preWait)
internal::ArgsMatcher< InnerMatcher > Args(const InnerMatcher &matcher)
—— Concurrent Priority Queue Implementation ——
FutexResult futexWait(const Futex *futex, uint32_t expected, uint32_t waitMask)
ParkingLot< std::uint32_t > parkingLot
std::chrono::milliseconds Duration
void atomic_notify_all(const std::atomic< Integer > *atomic)
void atomic_wait_impl(const Atom< std::uint32_t, Args... > *atomic, std::uint32_t expected)
constexpr auto data(C &c) -> decltype(c.data())
ParkResult park_until(const Key key, D &&data, ToPark &&toPark, PreWait &&preWait, std::chrono::time_point< Clock, Duration > deadline)
FutexResult futexWaitUntil(const Futex *futex, uint32_t expected, std::chrono::time_point< Clock, Duration > const &deadline, uint32_t waitMask)
void atomic_wait(const std::atomic< Integer > *atomic, Integer expected)
std::cv_status toCvStatus(FutexResult result)
void atomic_notify_one(const std::atomic< Integer > *atomic)
std::cv_status atomic_wait_until_impl(const Atom< std::uint32_t, Args... > *atomic, std::uint32_t expected, const std::chrono::time_point< Clock, Duration > &deadline)
std::atomic< std::uint32_t > atomic_uint_fast_wait_t
#define FOLLY_SAFE_DCHECK(expr, msg)
void atomic_notify_all_impl(const Atom< std::uint32_t, Args... > *atomic)
int futexWake(const Futex *futex, int count, uint32_t wakeMask)
std::cv_status atomic_wait_until(const std::atomic< Integer > *atomic, Integer expected, const std::chrono::time_point< Clock, Duration > &deadline)