diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-06-01 17:34:59 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-06-01 17:34:59 +0200 |
commit | 65292aaa79f94163a73aaa9bd7b3ecbc16b5ec26 (patch) | |
tree | e4d0f5c11bf833f5183930068bb5de2b72cd5823 /app/src/main | |
parent | 3d57eb633ec86d1dc357951995dcee81657b4c35 (diff) |
Topic: make reentrant
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'app/src/main')
-rw-r--r-- | app/src/main/java/com/wireguard/android/util/Topic.java | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/app/src/main/java/com/wireguard/android/util/Topic.java b/app/src/main/java/com/wireguard/android/util/Topic.java index eed13c9e..23f15e6e 100644 --- a/app/src/main/java/com/wireguard/android/util/Topic.java +++ b/app/src/main/java/com/wireguard/android/util/Topic.java @@ -24,7 +24,9 @@ public class Topic { if (subscribers == null) { subscribers = new LinkedList<>(); } - subscribers.add(new WeakReference<>(sub)); + synchronized (subscribers) { + subscribers.add(new WeakReference<>(sub)); + } } public void unsubscribe() { @@ -32,10 +34,12 @@ public class Topic { } public void unsubscribe(Subscriber sub) { - for (Iterator<WeakReference<Subscriber>> i = subscribers.iterator(); i.hasNext();) { - WeakReference<Subscriber> subscriber = i.next(); - if (subscriber.get() == null || subscriber.get() == sub) { - i.remove(); + synchronized (subscribers) { + for (Iterator<WeakReference<Subscriber>> i = subscribers.iterator(); i.hasNext(); ) { + WeakReference<Subscriber> subscriber = i.next(); + if (subscriber.get() == null || subscriber.get() == sub) { + i.remove(); + } } } } @@ -58,7 +62,11 @@ public class Topic { state = PUBLISHED; this.results = results; if (subscribers != null) { - for (WeakReference<Subscriber> subscriber : subscribers) { + List<WeakReference<Subscriber>> subscribersCopy = new LinkedList<>(); + synchronized (subscribers) { + subscribersCopy.addAll(subscribers); + } + for (WeakReference<Subscriber> subscriber : subscribersCopy) { if (subscriber.get() != null) subscriber.get().onTopicPublished(this); } @@ -86,12 +94,15 @@ public class Topic { topic.subscribe(this); } } + default void unsubscribeTopics() { for (Topic event : getSubscription()) { event.unsubscribe(this); } } + void onTopicPublished(Topic topic); + Topic[] getSubscription(); } } |