summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Rauwolf <rauwolf@itestra.de>2013-03-04 17:35:36 +0100
committerPhilip Rauwolf <rauwolf@itestra.de>2013-03-04 17:35:36 +0100
commit69ee45f2fc4fe323b5c0ae381e5092ef27d9e08b (patch)
tree6862bc319e85b2ff5d8ab16bd7235cf2d1fe3cac
parent6dd41e838d1a8df79e9c98c83e5e1605efb42890 (diff)
downloadgenivi-common-api-runtime-69ee45f2fc4fe323b5c0ae381e5092ef27d9e08b.tar.gz
Added mutex for event unsubscribe calls
-rw-r--r--src/CommonAPI/Event.h8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/CommonAPI/Event.h b/src/CommonAPI/Event.h
index 19a74fa..e79d491 100644
--- a/src/CommonAPI/Event.h
+++ b/src/CommonAPI/Event.h
@@ -10,6 +10,7 @@
#include <functional>
#include <list>
#include <tuple>
+#include <mutex>
namespace CommonAPI {
@@ -34,7 +35,7 @@ class Event {
Subscription subscribeCancellableListener(CancellableListener listener);
void unsubscribe(Subscription listenerSubscription);
- virtual ~Event() { }
+ virtual ~Event() {}
protected:
// Returns false if all subscriptions were cancelled
@@ -53,6 +54,7 @@ class Event {
private:
ListenersList listenersList_;
+ std::mutex listenerListMutex_;
};
template <typename... _Arguments>
@@ -94,7 +96,9 @@ template <typename... _Arguments>
void Event<_Arguments...>::unsubscribe(Subscription listenerSubscription) {
const CancellableListener cancellableListener = *listenerSubscription;
+ listenerListMutex_.lock();
listenersList_.erase(listenerSubscription);
+ listenerListMutex_.unlock();
onListenerRemoved(cancellableListener);
@@ -105,6 +109,7 @@ void Event<_Arguments...>::unsubscribe(Subscription listenerSubscription) {
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...);
@@ -116,6 +121,7 @@ SubscriptionStatus Event<_Arguments...>::notifyListeners(const _Arguments&... ev
} else
iterator++;
}
+ listenerListMutex_.unlock();
return listenersList_.empty() ? SubscriptionStatus::CANCEL : SubscriptionStatus::RETAIN;
}