| 922 | } |
| 923 | |
| 924 | void Finalize() { |
| 925 | std::unique_lock lock(mutex_); |
| 926 | finalized_ = true; |
| 927 | |
| 928 | ClientHolderList finalizing = std::move(holders_); |
| 929 | lock.unlock(); // avoid lock ordering issue with S3ClientHolder::Finalize |
| 930 | |
| 931 | // Finalize all client holders, such that no S3Client remains alive |
| 932 | // after this. |
| 933 | for (auto&& weak_holder : finalizing) { |
| 934 | auto holder = weak_holder.lock(); |
| 935 | if (holder) { |
| 936 | holder->Finalize(); |
| 937 | } |
| 938 | } |
| 939 | } |
| 940 | |
| 941 | auto LockShared() { return std::shared_lock(mutex_); } |
| 942 | |