diff options
author | jannaerin <golden.janna@gmail.com> | 2020-04-03 17:29:46 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-04-07 21:36:43 +0000 |
commit | 242d86b0e9a4091466682bbb97d2298839a91569 (patch) | |
tree | df762dbe927750bda201133ae9d667d8352560d2 /src/mongo/client/replica_set_change_notifier.h | |
parent | 402533f1804fc7b22c9cb09fad8f4f788e35f994 (diff) | |
download | mongo-242d86b0e9a4091466682bbb97d2298839a91569.tar.gz |
SERVER-42455 Make ReplicaSetChangeNotifier::onConfirmedSet safe during shutdown
Diffstat (limited to 'src/mongo/client/replica_set_change_notifier.h')
-rw-r--r-- | src/mongo/client/replica_set_change_notifier.h | 18 |
1 files changed, 4 insertions, 14 deletions
diff --git a/src/mongo/client/replica_set_change_notifier.h b/src/mongo/client/replica_set_change_notifier.h index 3ab802e7147..4408cd46d53 100644 --- a/src/mongo/client/replica_set_change_notifier.h +++ b/src/mongo/client/replica_set_change_notifier.h @@ -49,7 +49,6 @@ class ReplicaSetChangeNotifier { public: using Key = std::string; class Listener; - using ListenerHandle = std::unique_ptr<Listener, unique_function<void(Listener*)>>; struct State; public: @@ -88,24 +87,17 @@ public: typename... Args, typename = std::enable_if_t<std::is_constructible_v<DerivedT, Args...>>> auto makeListener(Args&&... args) { - auto deleter = [this](auto listener) { - _removeListener(listener); - delete listener; - }; - auto ptr = new DerivedT(std::forward<Args>(args)...); - + auto ptr = std::make_shared<DerivedT>(std::forward<Args>(args)...); _addListener(ptr); - - return ListenerHandle(ptr, std::move(deleter)); + return ptr; } private: - void _addListener(Listener* listener); - void _removeListener(Listener* listener); + void _addListener(std::shared_ptr<Listener> listener); Mutex _mutex = MONGO_MAKE_LATCH(HierarchicalAcquisitionLevel(0), "ReplicaSetChangeNotifier::_mutex"); - std::vector<Listener*> _listeners; + std::vector<std::weak_ptr<Listener>> _listeners; stdx::unordered_map<Key, State> _replicaSetStates; }; @@ -168,8 +160,6 @@ private: Notifier* _notifier = nullptr; }; -using ReplicaSetChangeListenerHandle = ReplicaSetChangeNotifier::ListenerHandle; - struct ReplicaSetChangeNotifier::State { ConnectionString connStr; HostAndPort primary; |