| 527 | } |
| 528 | |
| 529 | inline IObjectInQueue* WaitForJob() noexcept { |
| 530 | Mutex_.Acquire(); |
| 531 | |
| 532 | ++Free_; |
| 533 | |
| 534 | while (!Obj_ && !AllDone_) { |
| 535 | if (!CondReady_.WaitT(Mutex_, IdleTime_)) { |
| 536 | break; |
| 537 | } |
| 538 | } |
| 539 | |
| 540 | IObjectInQueue* ret = Obj_; |
| 541 | Obj_ = nullptr; |
| 542 | |
| 543 | --Free_; |
| 544 | |
| 545 | Mutex_.Release(); |
| 546 | CondFree_.Signal(); |
| 547 | |
| 548 | return ret; |
| 549 | } |
| 550 | |
| 551 | private: |
| 552 | TAdaptiveThreadPool* Parent_; |