257 {
258 ASSERT(sem_ != nullptr);
259 auto wait_ans = sem_->
Wait(timeout);
261 {
262#ifdef LIBXR_DEBUG_BUILD
263 ASSERT(state_.load(std::memory_order_acquire) == State::CLAIMED);
264#endif
265 state_.store(State::IDLE, std::memory_order_release);
266 return result_;
267 }
268
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))
273 {
275 }
276
277 ASSERT(expected == State::CLAIMED || expected == State::DETACHED ||
278 expected == State::IDLE);
279 if (expected == State::DETACHED)
280 {
281 state_.store(State::IDLE, std::memory_order_release);
283 }
284 if (expected == State::IDLE)
285 {
287 }
288
289 auto finish_wait_ans = sem_->
Wait(UINT32_MAX);
290 UNUSED(finish_wait_ans);
292 state_.store(State::IDLE, std::memory_order_release);
293 return result_;
294 }
ErrorCode Wait(uint32_t timeout=UINT32_MAX)
等待(减少)信号量 Waits (decrements) the semaphore