From 2ece273148e737bfc42702eb499a63dc71fda827 Mon Sep 17 00:00:00 2001 From: Emmanuel Bigeon Date: Sun, 7 Nov 2021 11:44:20 +0100 Subject: [PATCH] [fix] Put wait in while loops to consider spurious interruptions. Signed-off-by: Emmanuel Bigeon --- .../net/bigeon/gclc/tools/AOutputForwardRunnable.java | 5 ++++- .../java/net/bigeon/gclc/utils/ReadingRunnable.java | 11 ++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/gclc/src/main/java/net/bigeon/gclc/tools/AOutputForwardRunnable.java b/gclc/src/main/java/net/bigeon/gclc/tools/AOutputForwardRunnable.java index f73248b..e32ed38 100644 --- a/gclc/src/main/java/net/bigeon/gclc/tools/AOutputForwardRunnable.java +++ b/gclc/src/main/java/net/bigeon/gclc/tools/AOutputForwardRunnable.java @@ -156,8 +156,11 @@ public abstract class AOutputForwardRunnable implements Runnable { /** a method to wait some time. */ protected final void waitASec() { try { + final long tic = System.currentTimeMillis(); synchronized (this) { - wait(timeout); + while (System.currentTimeMillis() - tic < timeout) { + wait(timeout + tic - System.currentTimeMillis()); + } } } catch (final InterruptedException e) { LOGGER.log(Level.SEVERE, "Interrupted wait", //$NON-NLS-1$ diff --git a/gclc/src/main/java/net/bigeon/gclc/utils/ReadingRunnable.java b/gclc/src/main/java/net/bigeon/gclc/utils/ReadingRunnable.java index 0572e7e..8939e77 100644 --- a/gclc/src/main/java/net/bigeon/gclc/utils/ReadingRunnable.java +++ b/gclc/src/main/java/net/bigeon/gclc/utils/ReadingRunnable.java @@ -128,8 +128,11 @@ public final class ReadingRunnable implements Runnable { * @throws IOException if the runnable was stopped and no essage was found. */ private void doWaitMessage(final long timeout) throws IOException { try { + final long tic = System.currentTimeMillis(); synchronized (lock) { - lock.wait(timeout); + while (System.currentTimeMillis() - tic < timeout && messages.isEmpty()) { + lock.wait(timeout); + } } } catch (final InterruptedException e) { LOGGER.log(Level.SEVERE, THREAD_INTERRUPTION_EXCEPTION, e); @@ -205,7 +208,9 @@ public final class ReadingRunnable implements Runnable { mLock = messageBlocker.get(message); } synchronized (mLock) { - mLock.wait(); + while (messageBlocker.containsKey(message)) { + mLock.wait(); + } } } @@ -251,9 +256,9 @@ public final class ReadingRunnable implements Runnable { final Object mLock = messageBlocker.get(message); if (mLock!=null) { synchronized (mLock) { + messageBlocker.remove(message); mLock.notifyAll(); } - messageBlocker.remove(message); } } }