#include <functional>
#include <list>
#include <tuple>
+#include <mutex>
namespace CommonAPI {
Subscription subscribeCancellableListener(CancellableListener listener);
void unsubscribe(Subscription listenerSubscription);
- virtual ~Event() { }
+ virtual ~Event() {}
protected:
// Returns false if all subscriptions were cancelled
private:
ListenersList listenersList_;
+ std::mutex listenerListMutex_;
};
template <typename... _Arguments>
void Event<_Arguments...>::unsubscribe(Subscription listenerSubscription) {
const CancellableListener cancellableListener = *listenerSubscription;
+ listenerListMutex_.lock();
listenersList_.erase(listenerSubscription);
+ listenerListMutex_.unlock();
onListenerRemoved(cancellableListener);
template <typename... _Arguments>
SubscriptionStatus Event<_Arguments...>::notifyListeners(const _Arguments&... eventArguments) {
+ listenerListMutex_.lock();
for (auto iterator = listenersList_.begin(); iterator != listenersList_.end(); ) {
const CancellableListener& cancellableListener = *iterator;
const SubscriptionStatus listenerSubscriptionStatus = cancellableListener(eventArguments...);
} else
iterator++;
}
+ listenerListMutex_.unlock();
return listenersList_.empty() ? SubscriptionStatus::CANCEL : SubscriptionStatus::RETAIN;
}