| 108 | |
| 109 | |
| 110 | inline |
| 111 | void TaskQueue::run() |
| 112 | { |
| 113 | while (!isInterrupted()) |
| 114 | { |
| 115 | const ProcessTaskResult result = processTask(); |
| 116 | if (_sharedQueue) |
| 117 | { |
| 118 | const ProcessTaskResult sharedResult = _sharedQueue->processTask(); |
| 119 | sleepOnBlockedQueue(result, sharedResult); |
| 120 | } |
| 121 | else |
| 122 | { |
| 123 | sleepOnBlockedQueue(result); |
| 124 | } |
| 125 | } |
| 126 | //Clear remaining tasks |
| 127 | while (!_runQueue.empty()) |
| 128 | { |
| 129 | _runQueue.front()->terminate(); |
| 130 | _runQueue.pop_front(); |
| 131 | _stats.decNumElements(); |
| 132 | } |
| 133 | //========================= LOCKED SCOPE ========================= |
| 134 | SpinLock::Guard lock(_waitQueueLock); |
| 135 | while (!_waitQueue.empty()) |
| 136 | { |
| 137 | _waitQueue.front()->terminate(); |
| 138 | _waitQueue.pop_front(); |
| 139 | _stats.decNumElements(); |
| 140 | } |
| 141 | _isIdle = true; |
| 142 | } |
| 143 | |
| 144 | inline |
| 145 | void TaskQueue::sleepOnBlockedQueue(const ProcessTaskResult& mainQueueResult) |
no test coverage detected