| 226 | pool->queueLock.leave(); |
| 227 | } |
| 228 | Future<Void> stop(Error const& e) override { |
| 229 | if (error.code() == invalid_error_code) { |
| 230 | error = e; |
| 231 | } |
| 232 | |
| 233 | pool->queueLock.enter(); |
| 234 | TraceEvent("WorkPool_Stop") |
| 235 | .errorUnsuppressed(e) |
| 236 | .detail("Workers", pool->workers.size()) |
| 237 | .detail("Idle", pool->idle.size()) |
| 238 | .detail("Work", pool->work.size()); |
| 239 | |
| 240 | for (uint32_t i = 0; i < pool->work.size(); i++) |
| 241 | pool->work[i]->cancel(); // What if cancel() does something to this? |
| 242 | pool->work.clear(); |
| 243 | for (int i = 0; i < pool->workers.size(); i++) |
| 244 | pool->workers[i]->stop = true; |
| 245 | |
| 246 | std::vector<Worker*> idle; |
| 247 | std::swap(idle, pool->idle); |
| 248 | pool->queueLock.leave(); |
| 249 | |
| 250 | for (int i = 0; i < idle.size(); i++) |
| 251 | idle[i]->unblock(); |
| 252 | |
| 253 | pool->allStopped.add(Void()); |
| 254 | |
| 255 | return pool->allStopped.getResult(); |
| 256 | } |
| 257 | bool isCoro() const override { return IS_CORO; } |
| 258 | void addref() override { ReferenceCounted<WorkPool>::addref(); } |
| 259 | void delref() override { ReferenceCounted<WorkPool>::delref(); } |
no test coverage detected