Skip to content

Commit 62e68d5

Browse files
Merge pull request #1237 from akarnokd/SafeSubscriberMemory
SafeSubscriber memory reduction
2 parents 566e892 + 3c13498 commit 62e68d5

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

rxjava-core/src/main/java/rx/observers/SafeSubscriber.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
package rx.observers;
1717

1818
import java.util.Arrays;
19-
import java.util.concurrent.atomic.AtomicBoolean;
19+
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
2020

2121
import rx.Subscriber;
2222
import rx.exceptions.CompositeException;
@@ -60,7 +60,11 @@
6060
public class SafeSubscriber<T> extends Subscriber<T> {
6161

6262
private final Subscriber<? super T> actual;
63-
private final AtomicBoolean isFinished = new AtomicBoolean(false);
63+
/** Terminal state indication if not zero. */
64+
volatile int done;
65+
@SuppressWarnings("rawtypes")
66+
static final AtomicIntegerFieldUpdater<SafeSubscriber> DONE_UPDATER
67+
= AtomicIntegerFieldUpdater.newUpdater(SafeSubscriber.class, "done");
6468

6569
public SafeSubscriber(Subscriber<? super T> actual) {
6670
super(actual);
@@ -69,7 +73,7 @@ public SafeSubscriber(Subscriber<? super T> actual) {
6973

7074
@Override
7175
public void onCompleted() {
72-
if (isFinished.compareAndSet(false, true)) {
76+
if (DONE_UPDATER.getAndSet(this, 1) == 0) {
7377
try {
7478
actual.onCompleted();
7579
} catch (Throwable e) {
@@ -90,15 +94,15 @@ public void onError(Throwable e) {
9094
// we handle here instead of another method so we don't add stacks to the frame
9195
// which can prevent it from being able to handle StackOverflow
9296
Exceptions.throwIfFatal(e);
93-
if (isFinished.compareAndSet(false, true)) {
97+
if (DONE_UPDATER.getAndSet(this, 1) == 0) {
9498
_onError(e);
9599
}
96100
}
97101

98102
@Override
99103
public void onNext(T args) {
100104
try {
101-
if (!isFinished.get()) {
105+
if (done == 0) {
102106
actual.onNext(args);
103107
}
104108
} catch (Throwable e) {

0 commit comments

Comments
 (0)