From 2acaedb53802fd40ffc9b5ccc72ecbe851642f2b Mon Sep 17 00:00:00 2001 From: Doug Lea Date: Thu, 10 Oct 2013 09:57:50 +0100 Subject: [PATCH] 7011859: java/util/concurrent/Semaphore/RacingReleases.java failing Reviewed-by: alanb, dholmes --- .../concurrent/locks/AbstractQueuedLongSynchronizer.java | 6 ++++-- .../util/concurrent/locks/AbstractQueuedSynchronizer.java | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java b/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java index 4d885f44376..47fdbfb9443 100644 --- a/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java +++ b/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java @@ -489,7 +489,8 @@ public abstract class AbstractQueuedLongSynchronizer /* * Try to signal next queued node if: * Propagation was indicated by caller, - * or was recorded (as h.waitStatus) by a previous operation + * or was recorded (as h.waitStatus either before + * or after setHead) by a previous operation * (note: this uses sign-check of waitStatus because * PROPAGATE status may transition to SIGNAL.) * and @@ -501,7 +502,8 @@ public abstract class AbstractQueuedLongSynchronizer * racing acquires/releases, so most need signals now or soon * anyway. */ - if (propagate > 0 || h == null || h.waitStatus < 0) { + if (propagate > 0 || h == null || h.waitStatus < 0 || + (h = head) == null || h.waitStatus < 0) { Node s = node.next; if (s == null || s.isShared()) doReleaseShared(); diff --git a/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java b/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java index f0bdeb9030e..dce35765df7 100644 --- a/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java +++ b/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java @@ -711,7 +711,8 @@ public abstract class AbstractQueuedSynchronizer /* * Try to signal next queued node if: * Propagation was indicated by caller, - * or was recorded (as h.waitStatus) by a previous operation + * or was recorded (as h.waitStatus either before + * or after setHead) by a previous operation * (note: this uses sign-check of waitStatus because * PROPAGATE status may transition to SIGNAL.) * and @@ -723,7 +724,8 @@ public abstract class AbstractQueuedSynchronizer * racing acquires/releases, so most need signals now or soon * anyway. */ - if (propagate > 0 || h == null || h.waitStatus < 0) { + if (propagate > 0 || h == null || h.waitStatus < 0 || + (h = head) == null || h.waitStatus < 0) { Node s = node.next; if (s == null || s.isShared()) doReleaseShared();