Make BoundedStatsDeque threadsafe. Patch by brandonwilliams, reviewed by jbellis for CASSANDRA-4019
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/d6a13a68 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/d6a13a68 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/d6a13a68 Branch: refs/heads/trunk Commit: d6a13a68e163e23e0e3dd7087c0fd45fa063e376 Parents: ef01ca5 Author: Brandon Williams <brandonwilli...@apache.org> Authored: Thu Mar 8 17:39:51 2012 -0600 Committer: Brandon Williams <brandonwilli...@apache.org> Committed: Thu Mar 8 17:39:51 2012 -0600 ---------------------------------------------------------------------- .../apache/cassandra/utils/BoundedStatsDeque.java | 26 +++++++++------ 1 files changed, 16 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/d6a13a68/src/java/org/apache/cassandra/utils/BoundedStatsDeque.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/BoundedStatsDeque.java b/src/java/org/apache/cassandra/utils/BoundedStatsDeque.java index 3256564..5d27608 100644 --- a/src/java/org/apache/cassandra/utils/BoundedStatsDeque.java +++ b/src/java/org/apache/cassandra/utils/BoundedStatsDeque.java @@ -18,21 +18,20 @@ */ package org.apache.cassandra.utils; -import java.util.ArrayDeque; import java.util.Iterator; +import java.util.NoSuchElementException; +import java.util.concurrent.LinkedBlockingDeque; /** - * not threadsafe. caller is responsible for any locking necessary. + * bounded threadsafe deque */ public class BoundedStatsDeque extends AbstractStatsDeque { - private final int size; - protected final ArrayDeque<Double> deque; + protected final LinkedBlockingDeque<Double> deque; public BoundedStatsDeque(int size) { - this.size = size; - deque = new ArrayDeque<Double>(size); + deque = new LinkedBlockingDeque<Double>(size); } public Iterator<Double> iterator() @@ -50,12 +49,19 @@ public class BoundedStatsDeque extends AbstractStatsDeque deque.clear(); } - public void add(double o) + public void add(double i) { - if (size == deque.size()) + if (!deque.offer(i)) { - deque.remove(); + try + { + deque.remove(); + } + catch (NoSuchElementException e) + { + // oops, clear() beat us to it + } + deque.offer(i); } - deque.add(o); } }