Skip to content

Commit c268471

Browse files
Merge pull request #1813 from zsxwing/issue1812
Fix issue #1812 that zip may swallow requests
2 parents 002405a + 64bd6c1 commit c268471

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

src/main/java/rx/internal/operators/OperatorZip.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ void tick() {
227227
if (COUNTER_UPDATER.getAndIncrement(this) == 0) {
228228
do {
229229
// we only emit if requested > 0
230-
if (requested.get() > 0) {
230+
while (requested.get() > 0) {
231231
final Object[] vs = new Object[observers.length];
232232
boolean allHaveValues = true;
233233
for (int i = 0; i < observers.length; i++) {
@@ -279,6 +279,8 @@ void tick() {
279279
}
280280
emitted = 0;
281281
}
282+
} else {
283+
break;
282284
}
283285
}
284286
} while (COUNTER_UPDATER.decrementAndGet(this) > 0);

src/test/java/rx/internal/operators/OperatorZipTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,4 +1217,30 @@ public void run() {
12171217

12181218
});
12191219
}
1220+
1221+
@Test(timeout = 30000)
1222+
public void testIssue1812() {
1223+
// https://github.com/ReactiveX/RxJava/issues/1812
1224+
Observable<Integer> zip1 = Observable.zip(Observable.range(0, 1026), Observable.range(0, 1026),
1225+
new Func2<Integer, Integer, Integer>() {
1226+
1227+
@Override
1228+
public Integer call(Integer i1, Integer i2) {
1229+
return i1 + i2;
1230+
}
1231+
});
1232+
Observable<Integer> zip2 = Observable.zip(zip1, Observable.range(0, 1026),
1233+
new Func2<Integer, Integer, Integer>() {
1234+
1235+
@Override
1236+
public Integer call(Integer i1, Integer i2) {
1237+
return i1 + i2;
1238+
}
1239+
});
1240+
List<Integer> expected = new ArrayList<Integer>();
1241+
for (int i = 0; i < 1026; i++) {
1242+
expected.add(i * 3);
1243+
}
1244+
assertEquals(expected, zip2.toList().toBlocking().single());
1245+
}
12201246
}

0 commit comments

Comments
 (0)