summaryrefslogtreecommitdiff
path: root/include/CommonAPI/Event.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/CommonAPI/Event.hpp')
-rw-r--r--include/CommonAPI/Event.hpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/include/CommonAPI/Event.hpp b/include/CommonAPI/Event.hpp
index 90971f5..982f9a3 100644
--- a/include/CommonAPI/Event.hpp
+++ b/include/CommonAPI/Event.hpp
@@ -106,24 +106,31 @@ typename Event<_Arguments...>::Subscription Event<_Arguments...>::subscribe(List
template<typename ... _Arguments>
void Event<_Arguments...>::unsubscribe(Subscription subscription) {
bool isLastListener(false);
+ bool hasUnsubscribed(false);
subscriptionMutex_.lock();
auto listener = subscriptions_.find(subscription);
if (subscriptions_.end() != listener
&& pendingUnsubscriptions_.end() == pendingUnsubscriptions_.find(subscription)) {
- if (0 == pendingSubscriptions_.erase(subscription)) {
- pendingUnsubscriptions_.insert(subscription);
- isLastListener = (1 == subscriptions_.size());
- } else {
+ pendingUnsubscriptions_.insert(subscription);
+ isLastListener = (1 == subscriptions_.size());
+ hasUnsubscribed = true;
+ }
+ else {
+ listener = pendingSubscriptions_.find(subscription);
+ if (pendingSubscriptions_.end() != listener) {
+ pendingSubscriptions_.erase(subscription);
isLastListener = (0 == subscriptions_.size());
+ hasUnsubscribed = true;
}
}
subscriptionMutex_.unlock();
- if (subscriptions_.end() != listener) {
+ if (hasUnsubscribed) {
onListenerRemoved(listener->second);
- if (isLastListener)
+ if (isLastListener) {
onLastListenerRemoved(listener->second);
+ }
}
}