| 91 | } |
| 92 | |
| 93 | int CountdownEvent::timed_wait(const timespec& duetime) { |
| 94 | _wait_was_invoked = true; |
| 95 | for (;;) { |
| 96 | const int seen_counter = |
| 97 | ((butil::atomic<int>*)_butex)->load(butil::memory_order_acquire); |
| 98 | if (seen_counter <= 0) { |
| 99 | return 0; |
| 100 | } |
| 101 | if (butex_wait(_butex, seen_counter, &duetime) < 0 && |
| 102 | errno != EWOULDBLOCK && errno != EINTR) { |
| 103 | return errno; |
| 104 | } |
| 105 | } |
| 106 | } |
| 107 | |
| 108 | } // namespace bthread |