| 262 | } |
| 263 | |
| 264 | bool QueueBase::TryAttemptLocked(Action action, |
| 265 | std::vector<CleanUp>* clean_up) { |
| 266 | std::deque<Attempt>* attempts = |
| 267 | action == kEnqueue ? &enqueue_attempts_ : &dequeue_attempts_; |
| 268 | |
| 269 | bool progress = false; |
| 270 | bool done = false; |
| 271 | while (!done && !attempts->empty()) { |
| 272 | if (attempts->front().is_cancelled) { |
| 273 | if (action == kEnqueue) { |
| 274 | if (closed_) { |
| 275 | VLOG(1) << "Skipping cancelled enqueue attempt"; |
| 276 | } else { |
| 277 | LOG(WARNING) |
| 278 | << name_ |
| 279 | << ": Skipping cancelled enqueue attempt with queue not closed"; |
| 280 | } |
| 281 | } else { |
| 282 | if (closed_) { |
| 283 | VLOG(1) << "Skipping cancelled dequeue attempt"; |
| 284 | } else { |
| 285 | LOG(WARNING) |
| 286 | << name_ |
| 287 | << ": Skipping cancelled dequeue attempt with queue not closed"; |
| 288 | } |
| 289 | } |
| 290 | attempts->pop_front(); |
| 291 | } else { |
| 292 | Attempt* cur_attempt = &attempts->front(); |
| 293 | switch (cur_attempt->run_callback(cur_attempt)) { |
| 294 | case kNoProgress: |
| 295 | done = true; |
| 296 | break; |
| 297 | case kProgress: |
| 298 | done = true; |
| 299 | progress = true; |
| 300 | break; |
| 301 | case kComplete: |
| 302 | progress = true; |
| 303 | clean_up->emplace_back(std::move(cur_attempt->done_callback), |
| 304 | cur_attempt->cancellation_token, |
| 305 | cur_attempt->context->cancellation_manager()); |
| 306 | attempts->pop_front(); |
| 307 | break; |
| 308 | } |
| 309 | } |
| 310 | } |
| 311 | return progress; |
| 312 | } |
| 313 | |
| 314 | void QueueBase::FlushUnlocked() { |
| 315 | std::vector<CleanUp> clean_up; |
nothing calls this directly
no test coverage detected