diff --git a/briar-core/src/main/java/org/briarproject/briar/client/MessageTreeImpl.java b/briar-core/src/main/java/org/briarproject/briar/client/MessageTreeImpl.java index 05c345dbc..8176e3969 100644 --- a/briar-core/src/main/java/org/briarproject/briar/client/MessageTreeImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/client/MessageTreeImpl.java @@ -12,6 +12,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.ThreadSafe; @ThreadSafe @@ -19,10 +20,16 @@ import javax.annotation.concurrent.ThreadSafe; public class MessageTreeImpl implements MessageTree { + @GuardedBy("this") private final Map> nodeMap = new HashMap<>(); + + @GuardedBy("this") private final List roots = new ArrayList<>(); + + @GuardedBy("this") private final List> unsortedLists = new ArrayList<>(); + @SuppressWarnings("UseCompareMethod") private Comparator comparator = (o1, o2) -> Long.valueOf(o1.getTimestamp()).compareTo(o2.getTimestamp()); @@ -50,11 +57,13 @@ public class MessageTreeImpl add(Collections.singletonList(node)); } + @GuardedBy("this") private void markAsUnsorted(List list) { if (!unsortedLists.contains(list)) unsortedLists.add(list); } + @GuardedBy("this") private void parseNode(T node) { if (node.getParentId() == null) { roots.add(node); @@ -67,6 +76,7 @@ public class MessageTreeImpl } } + @GuardedBy("this") private void sortUnsorted() { for (List list : unsortedLists) { Collections.sort(list, comparator); @@ -74,6 +84,7 @@ public class MessageTreeImpl unsortedLists.clear(); } + @GuardedBy("this") private void traverse(List list, T node, int level) { list.add(node); List children = nodeMap.get(node.getId()); @@ -103,7 +114,7 @@ public class MessageTreeImpl } @Override - public boolean contains(MessageId m) { + public synchronized boolean contains(MessageId m) { return nodeMap.containsKey(m); } }