From afe152703941f9ce2b3a00afcb05ac121972ebee Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Tue, 15 Sep 2015 15:03:51 +0900 Subject: [PATCH] Use laxySet() when returning pool entries. --- .../java/com/zaxxer/hikari/pool/PoolEntry.java | 7 +++++++ .../com/zaxxer/hikari/util/ConcurrentBag.java | 18 ++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/pool/PoolEntry.java b/src/main/java/com/zaxxer/hikari/pool/PoolEntry.java index 84ced0fe..505c2e3b 100644 --- a/src/main/java/com/zaxxer/hikari/pool/PoolEntry.java +++ b/src/main/java/com/zaxxer/hikari/pool/PoolEntry.java @@ -155,6 +155,13 @@ public final class PoolEntry implements IConcurrentBagEntry return state.compareAndSet(expect, update); } + /** {@inheritDoc} */ + @Override + public void lazySet(int update) + { + state.lazySet(update); + } + /** {@inheritDoc} */ @Override public String toString() diff --git a/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java b/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java index 0789517e..51f408d6 100644 --- a/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java +++ b/src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java @@ -72,7 +72,8 @@ public class ConcurrentBag implements AutoCloseab int STATE_REMOVED = -1; int STATE_RESERVED = -2; - boolean compareAndSet(int from, int to); + boolean compareAndSet(int expectState, int newState); + void lazySet(int newState); int getState(); } @@ -173,17 +174,14 @@ public class ConcurrentBag implements AutoCloseab @SuppressWarnings("unchecked") public void requite(final T bagEntry) { - if (bagEntry.compareAndSet(STATE_IN_USE, STATE_NOT_IN_USE)) { - final List threadLocalList = threadList.get(); - if (threadLocalList != null) { - threadLocalList.add((weakThreadLocals ? new WeakReference<>(bagEntry) : bagEntry)); - } + bagEntry.lazySet(STATE_NOT_IN_USE); - synchronizer.signal(); - } - else { - LOGGER.warn("Attempt to remove an object from the bag that does not exist: {}", bagEntry); + final List threadLocalList = threadList.get(); + if (threadLocalList != null) { + threadLocalList.add((weakThreadLocals ? new WeakReference<>(bagEntry) : bagEntry)); } + + synchronizer.signal(); } /**