| 652 | } |
| 653 | |
| 654 | void Master::Reset(const ResetRequest* req, ResetResponse* resp, |
| 655 | MyClosure done) { |
| 656 | // Vector to hold the session pointers present in the sessions_ |
| 657 | // (string->Session*) map. |
| 658 | std::vector<MasterSession*> sessions_to_close; |
| 659 | { |
| 660 | mutex_lock l(mu_); |
| 661 | // NOTE(mrry): Transfer one reference to each session from the |
| 662 | // `sessions_` map to the `sessions_to_close` vector. |
| 663 | for (const auto& entry : sessions_) { |
| 664 | sessions_to_close.push_back(entry.second); |
| 665 | } |
| 666 | sessions_.clear(); |
| 667 | } |
| 668 | |
| 669 | CleanupWorkers(*req); |
| 670 | |
| 671 | SchedClosure([sessions_to_close, done]() { |
| 672 | Status s; |
| 673 | for (MasterSession* session : sessions_to_close) { |
| 674 | s.Update(session->Close()); |
| 675 | session->Unref(); |
| 676 | } |
| 677 | done(s); |
| 678 | }); |
| 679 | } |
| 680 | |
| 681 | void Master::MakeCallable(const MakeCallableRequest* req, |
| 682 | MakeCallableResponse* resp, MyClosure done) { |