| 148 | } |
| 149 | |
| 150 | inline T* Dequeue(TCont* c) { |
| 151 | T* ret = nullptr; |
| 152 | |
| 153 | while (!Q_.Dequeue(&ret)) { |
| 154 | AtomicSet(Signaled_, 0); |
| 155 | if (!AtomicCas(&SkipWait_, 0, 1)) { |
| 156 | if (!S_.Acquire(c)) { |
| 157 | break; |
| 158 | } |
| 159 | } |
| 160 | AtomicSet(Signaled_, 1); |
| 161 | } |
| 162 | |
| 163 | return ret; |
| 164 | } |
| 165 | |
| 166 | template <class TPtr> |
| 167 | inline void EnqueueSafe(TPtr req) { |