| 862 | } |
| 863 | |
| 864 | void Finalize() { |
| 865 | std::unique_lock lock(mutex_); |
| 866 | finalized_ = true; |
| 867 | |
| 868 | ClientHolderList finalizing = std::move(holders_); |
| 869 | lock.unlock(); // avoid lock ordering issue with S3ClientHolder::Finalize |
| 870 | |
| 871 | // Finalize all client holders, such that no S3Client remains alive |
| 872 | // after this. |
| 873 | for (auto&& weak_holder : finalizing) { |
| 874 | auto holder = weak_holder.lock(); |
| 875 | if (holder) { |
| 876 | holder->Finalize(); |
| 877 | } |
| 878 | } |
| 879 | } |
| 880 | |
| 881 | auto LockShared() { return std::shared_lock(mutex_); } |
| 882 | |