269 {
270 ASSERT(sem_ != nullptr);
271 auto wait_ans = sem_->
Wait(timeout);
273 {
274#ifdef LIBXR_DEBUG_BUILD
275 ASSERT(state_.load(std::memory_order_acquire) == State::CLAIMED);
276#endif
277 state_.store(State::IDLE, std::memory_order_release);
278 return result_;
279 }
280
281 State expected = State::PENDING;
282 if (state_.compare_exchange_strong(expected, State::DETACHED,
283 std::memory_order_acq_rel,
284 std::memory_order_acquire))
285 {
287 }
288
289 ASSERT(expected == State::CLAIMED || expected == State::DETACHED ||
290 expected == State::IDLE);
291 if (expected == State::DETACHED)
292 {
293 state_.store(State::IDLE, std::memory_order_release);
295 }
296 if (expected == State::IDLE)
297 {
299 }
300
301 auto finish_wait_ans = sem_->
Wait(UINT32_MAX);
302 UNUSED(finish_wait_ans);
304 state_.store(State::IDLE, std::memory_order_release);
305 return result_;
306 }
ErrorCode Wait(uint32_t timeout=UINT32_MAX)
等待(减少)信号量 Waits (decrements) the semaphore