| 321 | } |
| 322 | template <typename TCollection> |
| 323 | void DequeueAll(TCollection* res) { |
| 324 | AsyncRef(); |
| 325 | |
| 326 | TRootNode* newRoot = new TRootNode; |
| 327 | TRootNode* curRoot = JobQueue.load(std::memory_order_acquire); |
| 328 | do { |
| 329 | } while (!JobQueue.compare_exchange_weak(curRoot, newRoot)); |
| 330 | |
| 331 | FillCollection(curRoot->PopQueue, res); |
| 332 | |
| 333 | TListNode* toDeleteHead = curRoot->PushQueue; |
| 334 | TListNode* toDeleteTail = FillCollectionReverse(curRoot->PushQueue, res); |
| 335 | curRoot->PushQueue.store(nullptr, std::memory_order_release); |
| 336 | |
| 337 | if (toDeleteTail) { |
| 338 | toDeleteTail->Next.store(curRoot->PopQueue.load()); |
| 339 | } else { |
| 340 | toDeleteTail = curRoot->PopQueue; |
| 341 | } |
| 342 | curRoot->PopQueue.store(nullptr, std::memory_order_release); |
| 343 | |
| 344 | AsyncUnref(curRoot, toDeleteHead); |
| 345 | } |
| 346 | bool IsEmpty() { |
| 347 | AsyncRef(); |
| 348 | TRootNode* curRoot = JobQueue.load(std::memory_order_acquire); |
no test coverage detected