10 #ifndef EIGEN_CXX11_THREADPOOL_EVENTCOUNT_H
11 #define EIGEN_CXX11_THREADPOOL_EVENTCOUNT_H
77 if (
state_.compare_exchange_weak(state, newstate, std::memory_order_seq_cst))
return;
99 if (
state_.compare_exchange_weak(state, newstate, std::memory_order_acq_rel)) {
121 if (
state_.compare_exchange_weak(state, newstate, std::memory_order_acq_rel))
return;
128 std::atomic_thread_fence(std::memory_order_seq_cst);
140 }
else if (signals < waiters) {
146 uint64_t next =
w->next.load(std::memory_order_relaxed);
150 if (
state_.compare_exchange_weak(state, newstate, std::memory_order_acq_rel)) {
151 if (!notifyAll && (signals < waiters))
return;
154 if (!notifyAll)
w->next.store(
kStackMask, std::memory_order_relaxed);
202 static_assert(
kEpochBits >= 20,
"not enough bits to prevent ABA problem");
213 EIGEN_MUTEX_LOCK lock(
w->mu);
223 next = wnext ==
kStackMask ? nullptr : &
waiters_[internal::convert_index<size_t>(wnext)];
226 EIGEN_MUTEX_LOCK lock(
w->mu);
#define eigen_plain_assert(condition)
Definition: Assert.h:148
RowVector3d w
Definition: Matrix_resize_int.cpp:3
Definition: EventCount.h:184
uint64_t epoch
Definition: EventCount.h:196
EIGEN_MUTEX mu
Definition: EventCount.h:194
State
Definition: EventCount.h:187
@ kWaiting
Definition: EventCount.h:189
@ kNotSignaled
Definition: EventCount.h:188
@ kSignaled
Definition: EventCount.h:190
EIGEN_ALIGN_TO_AVOID_FALSE_SHARING std::atomic< uint64_t > next
Definition: EventCount.h:193
unsigned state
Definition: EventCount.h:197
EIGEN_CONDVAR cv
Definition: EventCount.h:195
Definition: EventCount.h:52
MaxSizeVector< Waiter > & waiters_
Definition: EventCount.h:236
EventCount(MaxSizeVector< Waiter > &waiters)
Definition: EventCount.h:56
std::atomic< uint64_t > state_
Definition: EventCount.h:235
static const uint64_t kEpochMask
Definition: EventCount.h:180
static const uint64_t kStackMask
Definition: EventCount.h:171
static const uint64_t kSignalInc
Definition: EventCount.h:177
void CommitWait(Waiter *w)
Definition: EventCount.h:82
static const uint64_t kEpochShift
Definition: EventCount.h:178
static const uint64_t kWaiterMask
Definition: EventCount.h:173
void operator=(const EventCount &)=delete
void Notify(bool notifyAll)
Definition: EventCount.h:127
void Unpark(Waiter *w)
Definition: EventCount.h:220
static const uint64_t kWaiterInc
Definition: EventCount.h:174
static const uint64_t kEpochBits
Definition: EventCount.h:179
void CancelWait()
Definition: EventCount.h:110
static const uint64_t kWaiterShift
Definition: EventCount.h:172
static void CheckState(uint64_t state, bool waiter=false)
Definition: EventCount.h:201
EventCount(const EventCount &)=delete
static const uint64_t kSignalMask
Definition: EventCount.h:176
static const uint64_t kEpochInc
Definition: EventCount.h:181
void Park(Waiter *w)
Definition: EventCount.h:212
static const uint64_t kWaiterBits
Definition: EventCount.h:170
static const uint64_t kSignalShift
Definition: EventCount.h:175
void Prewait()
Definition: EventCount.h:71
~EventCount()
Definition: EventCount.h:63
The MaxSizeVector class.
Definition: MaxSizeVector.h:31
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE size_t size() const
Definition: MaxSizeVector.h:115
std::uint64_t uint64_t
Definition: Meta.h:42
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70