236 enum class State : uint32_t
247 result_ = ErrorCode::OK;
248 state_.store(State::PENDING, std::memory_order_release);
251 void Cancel() { state_.store(State::IDLE, std::memory_order_release); }
255 ASSERT(sem_ !=
nullptr);
256 auto wait_ans = sem_->Wait(timeout);
257 if (wait_ans == ErrorCode::OK)
259#ifdef LIBXR_DEBUG_BUILD
260 ASSERT(state_.load(std::memory_order_acquire) == State::CLAIMED);
262 state_.store(State::IDLE, std::memory_order_release);
266 State expected = State::PENDING;
267 if (state_.compare_exchange_strong(expected, State::DETACHED,
268 std::memory_order_acq_rel,
269 std::memory_order_acquire))
271 return ErrorCode::TIMEOUT;
274 ASSERT(expected == State::CLAIMED || expected == State::DETACHED ||
275 expected == State::IDLE);
276 if (expected == State::DETACHED)
278 state_.store(State::IDLE, std::memory_order_release);
279 return ErrorCode::TIMEOUT;
281 if (expected == State::IDLE)
283 return ErrorCode::TIMEOUT;
286 auto finish_wait_ans = sem_->Wait(UINT32_MAX);
287 UNUSED(finish_wait_ans);
288 ASSERT(finish_wait_ans == ErrorCode::OK);
289 state_.store(State::IDLE, std::memory_order_release);
295 ASSERT(sem_ !=
nullptr);
297 State expected = State::PENDING;
298 if (!state_.compare_exchange_strong(expected, State::CLAIMED,
299 std::memory_order_acq_rel,
300 std::memory_order_acquire))
302 ASSERT(expected == State::DETACHED || expected == State::IDLE);
303 if (expected == State::DETACHED)
305 expected = State::DETACHED;
306 (void)state_.compare_exchange_strong(expected, State::IDLE,
307 std::memory_order_acq_rel,
308 std::memory_order_acquire);
314 sem_->PostFromCallback(in_isr);
320 std::atomic<State> state_{State::IDLE};