Merge branch 'message-tree-thread-safety' into 'master'

Ensure MessageTreeImpl#contains() is thread-safe

See merge request briar/briar!1213
This commit is contained in:
Torsten Grote
2020-01-23 11:02:55 +00:00

View File

@@ -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<T extends MessageTree.MessageNode>
implements MessageTree<T> {
@GuardedBy("this")
private final Map<MessageId, List<T>> nodeMap = new HashMap<>();
@GuardedBy("this")
private final List<T> roots = new ArrayList<>();
@GuardedBy("this")
private final List<List<T>> unsortedLists = new ArrayList<>();
@SuppressWarnings("UseCompareMethod")
private Comparator<T> comparator = (o1, o2) ->
Long.valueOf(o1.getTimestamp()).compareTo(o2.getTimestamp());
@@ -50,11 +57,13 @@ public class MessageTreeImpl<T extends MessageTree.MessageNode>
add(Collections.singletonList(node));
}
@GuardedBy("this")
private void markAsUnsorted(List<T> 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<T extends MessageTree.MessageNode>
}
}
@GuardedBy("this")
private void sortUnsorted() {
for (List<T> list : unsortedLists) {
Collections.sort(list, comparator);
@@ -74,6 +84,7 @@ public class MessageTreeImpl<T extends MessageTree.MessageNode>
unsortedLists.clear();
}
@GuardedBy("this")
private void traverse(List<T> list, T node, int level) {
list.add(node);
List<T> children = nodeMap.get(node.getId());
@@ -103,7 +114,7 @@ public class MessageTreeImpl<T extends MessageTree.MessageNode>
}
@Override
public boolean contains(MessageId m) {
public synchronized boolean contains(MessageId m) {
return nodeMap.containsKey(m);
}
}