You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2018/08/08 18:25:38 UTC
[1/2] activemq-artemis git commit: This closes #2223
Repository: activemq-artemis
Updated Branches:
refs/heads/master 70f551262 -> 6534b6c0b
This closes #2223
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/6534b6c0
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/6534b6c0
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/6534b6c0
Branch: refs/heads/master
Commit: 6534b6c0bbfa408da0ca5c4cbce7673f60c83272
Parents: 70f5512 64cf535
Author: Clebert Suconic <cl...@apache.org>
Authored: Wed Aug 8 14:25:28 2018 -0400
Committer: Clebert Suconic <cl...@apache.org>
Committed: Wed Aug 8 14:25:28 2018 -0400
----------------------------------------------------------------------
.../utils/collections/PriorityLinkedList.java | 11 +++++++++-
.../collections/PriorityLinkedListImpl.java | 23 +++++++++++++++-----
2 files changed, 27 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
[2/2] activemq-artemis git commit: ARTEMIS-2015
PriorityLinkedListImpl::isEmpty is not thread-safe
Posted by cl...@apache.org.
ARTEMIS-2015 PriorityLinkedListImpl::isEmpty is not thread-safe
PriorityLinkedListImpl::size access is changed to be safely
observable by a thread different from the one allowed to write
the list.
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/64cf5357
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/64cf5357
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/64cf5357
Branch: refs/heads/master
Commit: 64cf5357e1a88d98b4e2c3569bb10d489f55e404
Parents: 70f5512
Author: Francesco Nigro <ni...@gmail.com>
Authored: Tue Aug 7 18:53:13 2018 +0200
Committer: Clebert Suconic <cl...@apache.org>
Committed: Wed Aug 8 14:25:28 2018 -0400
----------------------------------------------------------------------
.../utils/collections/PriorityLinkedList.java | 11 +++++++++-
.../collections/PriorityLinkedListImpl.java | 23 +++++++++++++++-----
2 files changed, 27 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/64cf5357/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/PriorityLinkedList.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/PriorityLinkedList.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/PriorityLinkedList.java
index 79a99f3..19e58c2 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/PriorityLinkedList.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/PriorityLinkedList.java
@@ -18,7 +18,8 @@ package org.apache.activemq.artemis.utils.collections;
/**
* A type of linked list which maintains items according to a priority
- * and allows adding and removing of elements at both ends, and peeking
+ * and allows adding and removing of elements at both ends, and peeking.<br>
+ * Only {@link #size()} and {@link #isEmpty()} are safe to be called concurrently.
*/
public interface PriorityLinkedList<T> {
@@ -30,9 +31,17 @@ public interface PriorityLinkedList<T> {
void clear();
+ /**
+ * Returns the size of this list.<br>
+ * It is safe to be called concurrently.
+ */
int size();
LinkedListIterator<T> iterator();
+ /**
+ * Returns {@code true} if empty, {@code false} otherwise.<br>
+ * It is safe to be called concurrently.
+ */
boolean isEmpty();
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/64cf5357/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/PriorityLinkedListImpl.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/PriorityLinkedListImpl.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/PriorityLinkedListImpl.java
index 39d6b6d..00cf046 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/PriorityLinkedListImpl.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/PriorityLinkedListImpl.java
@@ -18,6 +18,7 @@ package org.apache.activemq.artemis.utils.collections;
import java.lang.reflect.Array;
import java.util.NoSuchElementException;
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
/**
* A priority linked list implementation
@@ -26,9 +27,11 @@ import java.util.NoSuchElementException;
*/
public class PriorityLinkedListImpl<T> implements PriorityLinkedList<T> {
+ private static final AtomicIntegerFieldUpdater<PriorityLinkedListImpl> SIZE_UPDATER = AtomicIntegerFieldUpdater.newUpdater(PriorityLinkedListImpl.class, "size");
+
protected LinkedListImpl<T>[] levels;
- private int size;
+ private volatile int size;
private int lastReset;
@@ -65,7 +68,7 @@ public class PriorityLinkedListImpl<T> implements PriorityLinkedList<T> {
levels[priority].addHead(t);
- size++;
+ exclusiveIncrementSize(1);
}
@Override
@@ -74,7 +77,7 @@ public class PriorityLinkedListImpl<T> implements PriorityLinkedList<T> {
levels[priority].addTail(t);
- size++;
+ exclusiveIncrementSize(1);
}
@Override
@@ -94,7 +97,7 @@ public class PriorityLinkedListImpl<T> implements PriorityLinkedList<T> {
t = ll.poll();
if (t != null) {
- size--;
+ exclusiveIncrementSize(-1);
if (ll.size() == 0) {
if (highestPriority == i) {
@@ -116,7 +119,15 @@ public class PriorityLinkedListImpl<T> implements PriorityLinkedList<T> {
list.clear();
}
- size = 0;
+ exclusiveSetSize(0);
+ }
+
+ private void exclusiveIncrementSize(int amount) {
+ SIZE_UPDATER.lazySet(this, this.size + amount);
+ }
+
+ private void exclusiveSetSize(int value) {
+ SIZE_UPDATER.lazySet(this, value);
}
@Override
@@ -242,7 +253,7 @@ public class PriorityLinkedListImpl<T> implements PriorityLinkedList<T> {
highestPriority = i;
}
- size--;
+ exclusiveIncrementSize(-1);
}
}
}