From 28a9a15e1cbc2422d56ed28fc6fa7093328c7764 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Thu, 8 Mar 2012 17:32:43 -0600 Subject: [PATCH] Make BoundedStatsDeque threadsafe. Patch by brandonwilliams, reviewed by jbellis for CASSANDRA-4019 --- .../cassandra/utils/BoundedStatsDeque.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/java/org/apache/cassandra/utils/BoundedStatsDeque.java b/src/java/org/apache/cassandra/utils/BoundedStatsDeque.java index 32565642de..5d27608ebd 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 deque; + protected final LinkedBlockingDeque deque; public BoundedStatsDeque(int size) { - this.size = size; - deque = new ArrayDeque(size); + deque = new LinkedBlockingDeque(size); } public Iterator 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); } }