26
26
27
27
abstract class AbstractSubscription <TResult > implements Subscription {
28
28
private static final Logger LOGGER = Loggers .getLogger ("client" );
29
+ private static final Object NULL_PLACEHOLDER = new Object ();
29
30
private final Observer <? super TResult > observer ;
30
31
31
32
/* protected by `this` */
@@ -36,7 +37,7 @@ abstract class AbstractSubscription<TResult> implements Subscription {
36
37
private boolean isTerminated = false ;
37
38
/* protected by `this` */
38
39
39
- private final ConcurrentLinkedQueue <TResult > resultsQueue = new ConcurrentLinkedQueue <TResult >();
40
+ private final ConcurrentLinkedQueue <Object > resultsQueue = new ConcurrentLinkedQueue <Object >();
40
41
41
42
AbstractSubscription (final Observer <? super TResult > observer ) {
42
43
this .observer = observer ;
@@ -109,14 +110,18 @@ synchronized long getRequested() {
109
110
}
110
111
111
112
void addToQueue (@ Nullable final TResult result ) {
112
- if (result != null ) {
113
+ if (result == null ) {
114
+ resultsQueue .add (NULL_PLACEHOLDER );
115
+ } else {
113
116
resultsQueue .add (result );
114
117
}
115
118
}
116
119
117
120
void addToQueue (@ Nullable final List <TResult > results ) {
118
121
if (results != null ) {
119
- resultsQueue .addAll (results );
122
+ for (TResult cur : results ) {
123
+ addToQueue (cur );
124
+ }
120
125
}
121
126
}
122
127
@@ -134,8 +139,11 @@ void onError(final Throwable t) {
134
139
}
135
140
}
136
141
137
- void onNext (final TResult next ) {
142
+ private void onNext (@ Nullable final TResult next ) {
138
143
if (!isTerminated ()) {
144
+ if (next == null ) {
145
+ throw new NullPointerException ();
146
+ }
139
147
try {
140
148
observer .onNext (next );
141
149
} catch (Throwable t ) {
@@ -145,7 +153,7 @@ void onNext(final TResult next) {
145
153
}
146
154
}
147
155
148
- void onComplete () {
156
+ private void onComplete () {
149
157
if (terminalAction ()) {
150
158
postTerminate ();
151
159
try {
@@ -173,6 +181,7 @@ void tryProcessResultsQueue() {
173
181
}
174
182
}
175
183
184
+ @ SuppressWarnings ("unchecked" )
176
185
private void processResultsQueue () {
177
186
boolean mustProcess = false ;
178
187
@@ -207,11 +216,11 @@ private void processResultsQueue() {
207
216
processedCount = 0 ;
208
217
209
218
while (localWanted > 0 ) {
210
- TResult item = resultsQueue .poll ();
219
+ Object item = resultsQueue .poll ();
211
220
if (item == null ) {
212
221
break ;
213
222
} else {
214
- onNext (item );
223
+ onNext (item == NULL_PLACEHOLDER ? null : ( TResult ) item );
215
224
localWanted -= 1 ;
216
225
processedCount += 1 ;
217
226
}
0 commit comments