239 enum class State : uint32_t
250 result_ = ErrorCode::OK;
251 state_.store(State::PENDING, std::memory_order_release);
254 void Cancel() { state_.store(State::IDLE, std::memory_order_release); }
258 ASSERT(sem_ !=
nullptr);
259 auto wait_ans = sem_->Wait(timeout);
260 if (wait_ans == ErrorCode::OK)
262#ifdef LIBXR_DEBUG_BUILD
263 ASSERT(state_.load(std::memory_order_acquire) == State::CLAIMED);
265 state_.store(State::IDLE, std::memory_order_release);
269 State expected = State::PENDING;
270 if (state_.compare_exchange_strong(expected, State::DETACHED,
271 std::memory_order_acq_rel,
272 std::memory_order_acquire))
274 return ErrorCode::TIMEOUT;
277 ASSERT(expected == State::CLAIMED || expected == State::DETACHED ||
278 expected == State::IDLE);
279 if (expected == State::DETACHED)
281 state_.store(State::IDLE, std::memory_order_release);
282 return ErrorCode::TIMEOUT;
284 if (expected == State::IDLE)
286 return ErrorCode::TIMEOUT;
289 auto finish_wait_ans = sem_->Wait(UINT32_MAX);
290 UNUSED(finish_wait_ans);
291 ASSERT(finish_wait_ans == ErrorCode::OK);
292 state_.store(State::IDLE, std::memory_order_release);
298 ASSERT(sem_ !=
nullptr);
300 State expected = State::PENDING;
301 if (!state_.compare_exchange_strong(expected, State::CLAIMED,
302 std::memory_order_acq_rel,
303 std::memory_order_acquire))
305 ASSERT(expected == State::DETACHED || expected == State::IDLE);
306 if (expected == State::DETACHED)
308 expected = State::DETACHED;
309 (void)state_.compare_exchange_strong(
310 expected, State::IDLE, std::memory_order_acq_rel, std::memory_order_acquire);
316 sem_->PostFromCallback(in_isr);
322 std::atomic<State> state_{State::IDLE};