From cd476832cc23e9b52b7d3d7d194ff9e33b734224 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Mon, 30 Jan 2017 10:03:20 -0500 Subject: [PATCH] Add check for Long.MAX_VALUE Issue: SPR-15203 --- .../reactive/AbstractListenerReadPublisher.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerReadPublisher.java b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerReadPublisher.java index 2e83b6c7af2..2b9c682cee2 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerReadPublisher.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractListenerReadPublisher.java @@ -116,10 +116,13 @@ public abstract class AbstractListenerReadPublisher implements Publisher { * @return {@code true} if there is more demand; {@code false} otherwise */ private boolean readAndPublish() throws IOException { - while (hasDemand()) { + long r; + while ((r = demand) > 0) { T data = read(); if (data != null) { - Operators.addAndGet(DEMAND_FIELD_UPDATER, this, -1L); + if (r != Long.MAX_VALUE) { + DEMAND_FIELD_UPDATER.addAndGet(this, -1L); + } this.subscriber.onNext(data); } else { @@ -129,10 +132,6 @@ public abstract class AbstractListenerReadPublisher implements Publisher { return false; } - private boolean hasDemand() { - return (this.demand > 0); - } - private boolean changeState(State oldState, State newState) { return this.state.compareAndSet(oldState, newState); }