diff --git a/src/main/java/net/engio/mbassy/common/AbstractConcurrentSet.java b/src/main/java/net/engio/mbassy/common/AbstractConcurrentSet.java index c2fb037..e1e790b 100644 --- a/src/main/java/net/engio/mbassy/common/AbstractConcurrentSet.java +++ b/src/main/java/net/engio/mbassy/common/AbstractConcurrentSet.java @@ -66,6 +66,10 @@ public abstract class AbstractConcurrentSet implements IConcurrentSet { return this.entries.size(); } + public boolean isEmpty() { + return this.head == null; + } + @Override public void addAll(Iterable elements) { Lock writeLock = this.lock.writeLock(); @@ -82,22 +86,14 @@ public abstract class AbstractConcurrentSet implements IConcurrentSet { } /** - * The return on this is DIFFERENT than normal. - * - * @return TRUE if there are no more elements (aka: this set is now empty) + * @return TRUE if the element was successfully removed */ @Override public boolean remove(T element) { if (!contains(element)) { // return quickly - Lock readLock = this.lock.readLock(); - readLock.lock(); - boolean headIsNull = this.head == null; - readLock.unlock(); - - return headIsNull; + return false; } else { - boolean wasLastElement = false; Lock writeLock = this.lock.writeLock(); try { writeLock.lock(); @@ -113,14 +109,10 @@ public abstract class AbstractConcurrentSet implements IConcurrentSet { //oldHead.clear(); // optimize for GC not possible because of potentially running iterators } this.entries.remove(element); - - if (this.head == null) { - wasLastElement = true; - } } finally { writeLock.unlock(); } - return wasLastElement; + return true; } } diff --git a/src/main/java/net/engio/mbassy/common/IConcurrentSet.java b/src/main/java/net/engio/mbassy/common/IConcurrentSet.java index 6b99afc..970401c 100644 --- a/src/main/java/net/engio/mbassy/common/IConcurrentSet.java +++ b/src/main/java/net/engio/mbassy/common/IConcurrentSet.java @@ -14,12 +14,12 @@ public interface IConcurrentSet extends Iterable { int size(); + boolean isEmpty(); + void addAll(Iterable elements); /** - * The return on this is DIFFERENT than normal. - * - * @return TRUE if there are no more elements (aka: this set is now empty) + * @return TRUE if the element was removed */ boolean remove(T element); } diff --git a/src/main/java/net/engio/mbassy/subscription/Subscription.java b/src/main/java/net/engio/mbassy/subscription/Subscription.java index 91e3e32..06f678c 100644 --- a/src/main/java/net/engio/mbassy/subscription/Subscription.java +++ b/src/main/java/net/engio/mbassy/subscription/Subscription.java @@ -110,13 +110,16 @@ public class Subscription { /** - * @return TRUE if there are no listeners subscribed + * @return TRUE if the element was removed */ public boolean unsubscribe(Object existingListener) { - // TRUE if there are no more elements (aka: this set is empty) return this.listeners.remove(existingListener); } + public boolean isEmpty() { + return this.listeners.isEmpty(); + } + public int size() { return this.listeners.size(); } diff --git a/src/main/java/net/engio/mbassy/subscription/SubscriptionManager.java b/src/main/java/net/engio/mbassy/subscription/SubscriptionManager.java index 3dabf24..17e97c8 100644 --- a/src/main/java/net/engio/mbassy/subscription/SubscriptionManager.java +++ b/src/main/java/net/engio/mbassy/subscription/SubscriptionManager.java @@ -73,8 +73,9 @@ public class SubscriptionManager { if (subscriptions != null) { for (Subscription subscription : subscriptions) { - boolean isEmpty = subscription.unsubscribe(listener); + subscription.unsubscribe(listener); + boolean isEmpty = subscription.isEmpty(); if (isEmpty) { // single or multi? Class[] handledMessageTypes = subscription.getHandledMessageTypes();