From 2accd8450e2c7235adf2e56f8c74cec2108216c5 Mon Sep 17 00:00:00 2001
From: Doug Lea
Date: Fri, 10 Mar 2017 08:59:14 -0800
Subject: [PATCH] 8176303: Flow.Subscription.request(0) should be treated as an
error
Reviewed-by: martin, chegar
---
.../share/classes/java/util/concurrent/Flow.java | 10 +++++-----
.../java/util/concurrent/SubmissionPublisher.java | 4 ++--
.../util/concurrent/tck/SubmissionPublisherTest.java | 9 ++++++++-
3 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/jdk/src/java.base/share/classes/java/util/concurrent/Flow.java b/jdk/src/java.base/share/classes/java/util/concurrent/Flow.java
index 9b53a8a54f9..65e994350ce 100644
--- a/jdk/src/java.base/share/classes/java/util/concurrent/Flow.java
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/Flow.java
@@ -271,11 +271,11 @@ public final class Flow {
/**
* Adds the given number {@code n} of items to the current
* unfulfilled demand for this subscription. If {@code n} is
- * negative, the Subscriber will receive an {@code onError}
- * signal with an {@link IllegalArgumentException} argument.
- * Otherwise, the Subscriber will receive up to {@code n}
- * additional {@code onNext} invocations (or fewer if
- * terminated).
+ * less than or equal to zero, the Subscriber will receive an
+ * {@code onError} signal with an {@link
+ * IllegalArgumentException} argument. Otherwise, the
+ * Subscriber will receive up to {@code n} additional {@code
+ * onNext} invocations (or fewer if terminated).
*
* @param n the increment of demand; a value of {@code
* Long.MAX_VALUE} may be considered as effectively unbounded
diff --git a/jdk/src/java.base/share/classes/java/util/concurrent/SubmissionPublisher.java b/jdk/src/java.base/share/classes/java/util/concurrent/SubmissionPublisher.java
index 9353e1f232f..fafc11b8c15 100644
--- a/jdk/src/java.base/share/classes/java/util/concurrent/SubmissionPublisher.java
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/SubmissionPublisher.java
@@ -1365,9 +1365,9 @@ public class SubmissionPublisher implements Flow.Publisher,
}
}
}
- else if (n < 0L)
+ else
onError(new IllegalArgumentException(
- "negative subscription request"));
+ "non-positive subscription request"));
}
public final boolean isReleasable() { // for ManagedBlocker
diff --git a/jdk/test/java/util/concurrent/tck/SubmissionPublisherTest.java b/jdk/test/java/util/concurrent/tck/SubmissionPublisherTest.java
index 2b4fea03a84..102d1b5e3ef 100644
--- a/jdk/test/java/util/concurrent/tck/SubmissionPublisherTest.java
+++ b/jdk/test/java/util/concurrent/tck/SubmissionPublisherTest.java
@@ -560,17 +560,21 @@ public class SubmissionPublisherTest extends JSR166TestCase {
}
/**
- * Negative request causes error
+ * Non-positive request causes error
*/
public void testRequest3() {
SubmissionPublisher p = basicPublisher();
TestSubscriber s1 = new TestSubscriber();
TestSubscriber s2 = new TestSubscriber();
+ TestSubscriber s3 = new TestSubscriber();
p.subscribe(s1);
p.subscribe(s2);
+ p.subscribe(s3);
+ s3.awaitSubscribe();
s2.awaitSubscribe();
s1.awaitSubscribe();
s1.sn.request(-1L);
+ s3.sn.request(0L);
p.submit(1);
p.submit(2);
p.close();
@@ -580,6 +584,9 @@ public class SubmissionPublisherTest extends JSR166TestCase {
s1.awaitError();
assertEquals(1, s1.errors);
assertTrue(s1.lastError instanceof IllegalArgumentException);
+ s3.awaitError();
+ assertEquals(1, s3.errors);
+ assertTrue(s3.lastError instanceof IllegalArgumentException);
}
/**