254 {
255 ASSERT(sem_ != nullptr);
256 auto wait_ans = sem_->
Wait(timeout);
258 {
259#ifdef LIBXR_DEBUG_BUILD
260 ASSERT(state_.load(std::memory_order_acquire) == State::CLAIMED);
261#endif
262 state_.store(State::IDLE, std::memory_order_release);
263 return result_;
264 }
265
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))
270 {
272 }
273
274 ASSERT(expected == State::CLAIMED || expected == State::DETACHED ||
275 expected == State::IDLE);
276 if (expected == State::DETACHED)
277 {
278 state_.store(State::IDLE, std::memory_order_release);
280 }
281 if (expected == State::IDLE)
282 {
284 }
285
286 auto finish_wait_ans = sem_->
Wait(UINT32_MAX);
287 UNUSED(finish_wait_ans);
289 state_.store(State::IDLE, std::memory_order_release);
290 return result_;
291 }
ErrorCode Wait(uint32_t timeout=UINT32_MAX)
等待(减少)信号量 Waits (decrements) the semaphore