diff options
author | Dirk Huss <dirk_huss@mentor.com> | 2016-05-25 19:00:32 +0200 |
---|---|---|
committer | Dirk Huss <dirk_huss@mentor.com> | 2016-05-25 19:00:32 +0200 |
commit | 534894b27a5e6b86cf8d2bd7b53d55d04f2a1bcc (patch) | |
tree | 3ee994cc8d94f3c5e96c1b88dd15bc9d58e81e89 /include/CommonAPI/Event.hpp | |
parent | 1c158272e2ee4b93021a97ac3b5c207a137b0d2c (diff) | |
download | genivi-common-api-runtime-534894b27a5e6b86cf8d2bd7b53d55d04f2a1bcc.tar.gz |
CommonAPI 3.1.83.1.8
Diffstat (limited to 'include/CommonAPI/Event.hpp')
-rw-r--r-- | include/CommonAPI/Event.hpp | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/include/CommonAPI/Event.hpp b/include/CommonAPI/Event.hpp index a31c677..91da3d6 100644 --- a/include/CommonAPI/Event.hpp +++ b/include/CommonAPI/Event.hpp @@ -71,7 +71,7 @@ public: protected: void notifyListeners(const Arguments_&... _eventArguments); void notifySpecificListener(const Subscription _subscription, const Arguments_&... _eventArguments); - void notifyError(const CallStatus status); + void notifySpecificError(const Subscription _subscription, const CallStatus status); virtual void onFirstListenerAdded(const Listener &_listener) { (void)_listener; @@ -216,7 +216,7 @@ void Event<Arguments_...>::notifySpecificListener(const Subscription subscriptio } template<typename ... Arguments_> -void Event<Arguments_...>::notifyError(const CallStatus status) { +void Event<Arguments_...>::notifySpecificError(const Subscription subscription, const CallStatus status) { subscriptionMutex_.lock(); notificationMutex_.lock(); @@ -236,13 +236,34 @@ void Event<Arguments_...>::notifyError(const CallStatus status) { subscriptionMutex_.unlock(); for (auto iterator = subscriptions_.begin(); iterator != subscriptions_.end(); iterator++) { - ErrorListener listener = std::get<1>(iterator->second); - if (listener) { - listener(status); + if (subscription == iterator->first) { + ErrorListener listener = std::get<1>(iterator->second); + if (listener) { + listener(status); + } } } notificationMutex_.unlock(); + + if (status != CommonAPI::CallStatus::SUCCESS) { + subscriptionMutex_.lock(); + auto listenerIterator = subscriptions_.find(subscription); + if (subscriptions_.end() != listenerIterator) { + if (pendingUnsubscriptions_.end() == pendingUnsubscriptions_.find(subscription)) { + if (0 == pendingSubscriptions_.erase(subscription)) { + pendingUnsubscriptions_.insert(subscription); + } + } + } + else { + listenerIterator = pendingSubscriptions_.find(subscription); + if (pendingSubscriptions_.end() != listenerIterator) { + pendingSubscriptions_.erase(subscription); + } + } + subscriptionMutex_.unlock(); + } } } // namespace CommonAPI |