38 reinterpret_cast< std::atomic<uint64_t>*
>(address)->
operator++();
43 uint64_t demanded_ticket,
44 uint64_t polling_spins,
45 uint64_t max_interval_us)
const {
46 if (cur_ticket_ >= demanded_ticket) {
49 spin_poll(demanded_ticket, polling_spins);
52 while (cur_ticket_ < demanded_ticket) {
53 std::this_thread::sleep_for(std::chrono::microseconds(interval_us));
54 interval_us = std::min<uint64_t>(interval_us * 2ULL, max_interval_us);
59 std::chrono::high_resolution_clock::time_point now = std::chrono::high_resolution_clock::now();
60 return std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()).count();
64 uint64_t demanded_ticket,
65 uint64_t timeout_microsec,
66 uint64_t polling_spins,
67 uint64_t max_interval_us)
const {
68 if (cur_ticket_ >= demanded_ticket) {
72 uint64_t end_us = start_us + timeout_microsec;
73 spin_poll(demanded_ticket, polling_spins);
76 while (cur_ticket_ < demanded_ticket) {
78 if (now_us > end_us) {
81 std::this_thread::sleep_for(std::chrono::microseconds(interval_us));
82 interval_us = std::min<uint64_t>(interval_us * 2ULL, max_interval_us);
87 void SharedPolling::spin_poll(uint64_t demanded_ticket, uint64_t polling_spins)
const {
88 for (uint64_t i = 0; i < polling_spins; ++i) {
89 if (cur_ticket_ >= demanded_ticket) {
106 uint64_t ret = cur_ticket_ + 1ULL;
uint64_t get_now_microsec()
Root package of FOEDUS (Fast Optimistic Engine for Data Unification Services).
void wait(uint64_t demanded_ticket, uint64_t polling_spins=kDefaultPollingSpins, uint64_t max_interval_us=kDefaultPollingMaxIntervalUs) const
Unconditionally wait for signal.
uint64_t acquire_ticket() const
Gives the ticket to.
const uint64_t kInitialPollingIntervalUs
Initial value of sleep interval in us.
void spinlock_yield()
Invoke _mm_pause(), x86 PAUSE instruction, or something equivalent in the env.
Atomic fence methods and load/store with fences that work for both C++11/non-C++11 code...
void ugly_atomic_inc(uint32_t *address)
void memory_fence_acquire()
Equivalent to std::atomic_thread_fence(std::memory_order_acquire).
bool timedwait(uint64_t demanded_ticket, uint64_t timeout_microsec, uint64_t polling_spins=kDefaultPollingSpins, uint64_t max_interval_us=kDefaultPollingMaxIntervalUs) const
Wait for signal up to the given timeout.
void signal()
Signal it to let waiters exit.
void memory_fence_acq_rel()
Equivalent to std::atomic_thread_fence(std::memory_order_acq_rel).