summaryrefslogtreecommitdiff
path: root/src/mongo/client/replica_set_change_notifier.h
diff options
context:
space:
mode:
authorjannaerin <golden.janna@gmail.com>2020-04-03 17:29:46 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-04-07 21:36:43 +0000
commit242d86b0e9a4091466682bbb97d2298839a91569 (patch)
treedf762dbe927750bda201133ae9d667d8352560d2 /src/mongo/client/replica_set_change_notifier.h
parent402533f1804fc7b22c9cb09fad8f4f788e35f994 (diff)
downloadmongo-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.h18
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;