summaryrefslogtreecommitdiffhomepage
path: root/app/src/main/java
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2018-06-01 17:34:59 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2018-06-01 17:34:59 +0200
commit65292aaa79f94163a73aaa9bd7b3ecbc16b5ec26 (patch)
treee4d0f5c11bf833f5183930068bb5de2b72cd5823 /app/src/main/java
parent3d57eb633ec86d1dc357951995dcee81657b4c35 (diff)
Topic: make reentrant
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/com/wireguard/android/util/Topic.java23
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();
}
}