From 6a5ecbbc2272a1996fdac06b0b9ee6774a0085da Mon Sep 17 00:00:00 2001 From: Anuraag Agrawal Date: Tue, 24 Nov 2020 16:21:38 +0900 Subject: [PATCH 1/3] Expose a method to remove a stale reference for subclasses that override expungeStaleEntries. --- .../AbstractWeakConcurrentMap.java | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java b/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java index a0b2782..722b1c1 100644 --- a/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java +++ b/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java @@ -166,13 +166,36 @@ protected V defaultValue(K key) { return null; } + /** + * Removes the value corresponding to the already garbage collected {@link Reference}. This + * should generally only be used if overriding {@link #expungeStaleEntries()} to execute code + * when references have been collected. + * + *
{@code
+     *
+     * class MyReferenceListener extends WeakConcurrentMap.WithInlinedExpunction {     *
+     *   public void expungeStaleEntries() {
+     *     Reference reference;
+     *     while ((reference = poll()) != null) {
+     *       V value = expungeStaleEntry(reference);
+     *       if (value != null) {
+     *         reportOrphanedReference(value);
+     *       }
+     *     }
+     *   }
+     * }
+ */ + protected final V expungeStaleEntry(Reference reference) { + return target.remove(reference); + } + /** * Cleans all unused references. */ public void expungeStaleEntries() { Reference reference; while ((reference = poll()) != null) { - target.remove(reference); + expungeStaleEntry(reference); } } @@ -189,7 +212,7 @@ public int approximateSize() { public void run() { try { while (!Thread.interrupted()) { - target.remove(remove()); + expungeStaleEntry(remove()); } } catch (InterruptedException ignored) { // do nothing @@ -344,4 +367,4 @@ public V setValue(V value) { return entry.setValue(value); } } -} \ No newline at end of file +} From 5b99c5bbf96761c5cb61878fae63116f42760ab1 Mon Sep 17 00:00:00 2001 From: Anuraag Agrawal Date: Tue, 24 Nov 2020 16:24:00 +0900 Subject: [PATCH 2/3] Fuzz --- .../mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java b/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java index 722b1c1..b0139ce 100644 --- a/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java +++ b/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java @@ -171,9 +171,8 @@ protected V defaultValue(K key) { * should generally only be used if overriding {@link #expungeStaleEntries()} to execute code * when references have been collected. * - *
{@code
-     *
-     * class MyReferenceListener extends WeakConcurrentMap.WithInlinedExpunction {     *
+     * 
{@code     *
+     * class MyReferenceListener extends WeakConcurrentMap.WithInlinedExpunction {
      *   public void expungeStaleEntries() {
      *     Reference reference;
      *     while ((reference = poll()) != null) {

From 7eade552020258c7d77a678c9b470232bb103fdb Mon Sep 17 00:00:00 2001
From: Anuraag Agrawal 
Date: Tue, 24 Nov 2020 16:24:22 +0900
Subject: [PATCH 3/3] Fuzz

---
 .../mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java b/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java
index b0139ce..7f4b4a9 100644
--- a/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java
+++ b/src/main/java/com/blogspot/mydailyjava/weaklockfree/AbstractWeakConcurrentMap.java
@@ -171,7 +171,7 @@ protected V defaultValue(K key) {
      * should generally only be used if overriding {@link #expungeStaleEntries()} to execute code
      * when references have been collected.
      *
-     * 
{@code     *
+     * 
{@code
      * class MyReferenceListener extends WeakConcurrentMap.WithInlinedExpunction {
      *   public void expungeStaleEntries() {
      *     Reference reference;