@@ -65,25 +65,27 @@ public void call(Subscriber<? super R> child) {
65
65
}
66
66
67
67
/** Manages sub-observers and subscriptions. */
68
- final class ResultManager implements Subscription {
68
+ final class ResultManager extends HashMap <Integer , Observer <T2 >>implements Subscription {
69
+ // HashMap aspect of `this` refers to `leftMap`
70
+
71
+ private static final long serialVersionUID = -3035156013812425335L ;
72
+
69
73
final RefCountSubscription cancel ;
70
74
final Subscriber <? super R > subscriber ;
71
75
final CompositeSubscription group ;
72
- final Object guard = new Object ();
73
- /** Guarded by guard. */
76
+ /** Guarded by this. */
74
77
int leftIds ;
75
- /** Guarded by guard . */
78
+ /** Guarded by this . */
76
79
int rightIds ;
77
- /** Guarded by guard. */
78
- final Map <Integer , Observer <T2 >> leftMap = new HashMap <Integer , Observer <T2 >>(); // NOPMD
79
- /** Guarded by guard. */
80
+ /** Guarded by this. */
80
81
final Map <Integer , T2 > rightMap = new HashMap <Integer , T2 >(); // NOPMD
81
- /** Guarded by guard . */
82
+ /** Guarded by this . */
82
83
boolean leftDone ;
83
- /** Guarded by guard . */
84
+ /** Guarded by this . */
84
85
boolean rightDone ;
85
86
86
87
public ResultManager (Subscriber <? super R > subscriber ) {
88
+ super ();
87
89
this .subscriber = subscriber ;
88
90
this .group = new CompositeSubscription ();
89
91
this .cancel = new RefCountSubscription (group );
@@ -110,15 +112,20 @@ public void unsubscribe() {
110
112
public boolean isUnsubscribed () {
111
113
return cancel .isUnsubscribed ();
112
114
}
115
+
116
+ Map <Integer , Observer <T2 >> leftMap () {
117
+ return this ;
118
+ }
119
+
113
120
/**
114
121
* Notify everyone and cleanup.
115
122
* @param e the exception
116
123
*/
117
124
void errorAll (Throwable e ) {
118
125
List <Observer <T2 >> list ;
119
- synchronized (guard ) {
120
- list = new ArrayList <Observer <T2 >>(leftMap .values ());
121
- leftMap .clear ();
126
+ synchronized (ResultManager . this ) {
127
+ list = new ArrayList <Observer <T2 >>(leftMap () .values ());
128
+ leftMap () .clear ();
122
129
rightMap .clear ();
123
130
}
124
131
for (Observer <T2 > o : list ) {
@@ -132,8 +139,8 @@ void errorAll(Throwable e) {
132
139
* @param e the exception
133
140
*/
134
141
void errorMain (Throwable e ) {
135
- synchronized (guard ) {
136
- leftMap .clear ();
142
+ synchronized (ResultManager . this ) {
143
+ leftMap () .clear ();
137
144
rightMap .clear ();
138
145
}
139
146
subscriber .onError (e );
@@ -158,9 +165,9 @@ public void onNext(T1 args) {
158
165
Subject <T2 , T2 > subj = PublishSubject .create ();
159
166
Observer <T2 > subjSerial = new SerializedObserver <T2 >(subj );
160
167
161
- synchronized (guard ) {
168
+ synchronized (ResultManager . this ) {
162
169
id = leftIds ++;
163
- leftMap .put (id , subjSerial );
170
+ leftMap () .put (id , subjSerial );
164
171
}
165
172
166
173
Observable <T2 > window = Observable .create (new WindowObservableFunc <T2 >(subj , cancel ));
@@ -174,7 +181,7 @@ public void onNext(T1 args) {
174
181
R result = resultSelector .call (args , window );
175
182
176
183
List <T2 > rightMapValues ;
177
- synchronized (guard ) {
184
+ synchronized (ResultManager . this ) {
178
185
rightMapValues = new ArrayList <T2 >(rightMap .values ());
179
186
}
180
187
@@ -192,11 +199,11 @@ public void onNext(T1 args) {
192
199
@ Override
193
200
public void onCompleted () {
194
201
List <Observer <T2 >> list = null ;
195
- synchronized (guard ) {
202
+ synchronized (ResultManager . this ) {
196
203
leftDone = true ;
197
204
if (rightDone ) {
198
- list = new ArrayList <Observer <T2 >>(leftMap .values ());
199
- leftMap .clear ();
205
+ list = new ArrayList <Observer <T2 >>(leftMap () .values ());
206
+ leftMap () .clear ();
200
207
rightMap .clear ();
201
208
}
202
209
}
@@ -216,7 +223,7 @@ final class RightObserver extends Subscriber<T2> {
216
223
public void onNext (T2 args ) {
217
224
try {
218
225
int id ;
219
- synchronized (guard ) {
226
+ synchronized (ResultManager . this ) {
220
227
id = rightIds ++;
221
228
rightMap .put (id , args );
222
229
}
@@ -228,8 +235,8 @@ public void onNext(T2 args) {
228
235
duration .unsafeSubscribe (d2 );
229
236
230
237
List <Observer <T2 >> list ;
231
- synchronized (guard ) {
232
- list = new ArrayList <Observer <T2 >>(leftMap .values ());
238
+ synchronized (ResultManager . this ) {
239
+ list = new ArrayList <Observer <T2 >>(leftMap () .values ());
233
240
}
234
241
for (Observer <T2 > o : list ) {
235
242
o .onNext (args );
@@ -242,11 +249,11 @@ public void onNext(T2 args) {
242
249
@ Override
243
250
public void onCompleted () {
244
251
List <Observer <T2 >> list = null ;
245
- synchronized (guard ) {
252
+ synchronized (ResultManager . this ) {
246
253
rightDone = true ;
247
254
if (leftDone ) {
248
- list = new ArrayList <Observer <T2 >>(leftMap .values ());
249
- leftMap .clear ();
255
+ list = new ArrayList <Observer <T2 >>(leftMap () .values ());
256
+ leftMap () .clear ();
250
257
rightMap .clear ();
251
258
}
252
259
}
@@ -273,8 +280,8 @@ public void onCompleted() {
273
280
if (once ) {
274
281
once = false ;
275
282
Observer <T2 > gr ;
276
- synchronized (guard ) {
277
- gr = leftMap .remove (id );
283
+ synchronized (ResultManager . this ) {
284
+ gr = leftMap () .remove (id );
278
285
}
279
286
if (gr != null ) {
280
287
gr .onCompleted ();
@@ -306,7 +313,7 @@ public RightDurationObserver(int id) {
306
313
public void onCompleted () {
307
314
if (once ) {
308
315
once = false ;
309
- synchronized (guard ) {
316
+ synchronized (ResultManager . this ) {
310
317
rightMap .remove (id );
311
318
}
312
319
group .remove (this );
0 commit comments