55#include < vector>
66#include < utility>
77#include < mutex>
8+ #include < algorithm>
89
910namespace lars {
1011
@@ -45,7 +46,7 @@ namespace lars{
4546
4647 struct StoredHandler {
4748 HandlerID id;
48- Handler callback;
49+ std::shared_ptr< Handler> callback;
4950 };
5051
5152 using HandlerList = std::vector<StoredHandler>;
@@ -60,7 +61,7 @@ namespace lars{
6061
6162 HandlerID addHandler (Handler h)const {
6263 std::lock_guard<std::mutex> lock (data->observerMutex );
63- data->observers .emplace_back (StoredHandler{data->IDCounter ,h });
64+ data->observers .emplace_back (StoredHandler{data->IDCounter ,std::make_shared<Handler>(h) });
6465 return data->IDCounter ++;
6566 }
6667
@@ -108,11 +109,17 @@ namespace lars{
108109 }
109110
110111 void emit (Args ... args) const {
112+ std::vector<std::weak_ptr<Handler>> handlers;
113+ handlers.resize (data->observers .size ());
111114 data->observerMutex .lock ();
112- auto tmpObservers = data->observers ;
115+ std::transform (data->observers .begin (), data->observers .end (), handlers.begin (), [](auto &h){
116+ return h.callback ;
117+ });
113118 data->observerMutex .unlock ();
114- for (auto &observer: tmpObservers){
115- observer.callback (args...);
119+ for (auto &weakCallback: handlers){
120+ if (auto callback = weakCallback.lock ()){
121+ (*callback)(args...);
122+ }
116123 }
117124 }
118125
0 commit comments