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();