Defer failure in CallbackGroup until all are completed

This avoids staged CallbackGroups like used in CS2 or SBS2
from triggering multiple error panels when an earlier group
fails and is unable to "finish" a later group.

Change-Id: I05a976fa8fa635a2035ed0ceeb69dfbd2a451b54
This commit is contained in:
Shawn Pearce
2015-01-02 22:42:28 -08:00
parent 3b81a0398c
commit a66c005995

View File

@@ -108,6 +108,15 @@ public class CallbackGroup {
}
}
private void applyAllFailed() {
if (failed && finalAdded && remaining.isEmpty()) {
for (CallbackImpl<?> cb : callbacks) {
cb.applyFailed();
}
callbacks.clear();
}
}
private <T> Callback<T> handleAdd(AsyncCallback<T> cb) {
if (failed) {
cb.onFailure(failedThrowable);
@@ -140,10 +149,6 @@ public class CallbackGroup {
@Override
public void onSuccess(T value) {
if (failed) {
return;
}
this.result = value;
remaining.remove(this);
CallbackGroup.this.applyAllSuccess();
@@ -151,19 +156,12 @@ public class CallbackGroup {
@Override
public void onFailure(Throwable caught) {
if (failed) {
return;
if (!failed) {
failed = true;
failedThrowable = caught;
}
failed = true;
failedThrowable = caught;
for (CallbackImpl<?> cb : callbacks) {
cb.delegate.onFailure(failedThrowable);
cb.delegate = null;
cb.result = null;
}
callbacks.clear();
remaining.clear();
remaining.remove(this);
CallbackGroup.this.applyAllFailed();
}
void applySuccess() {
@@ -174,5 +172,14 @@ public class CallbackGroup {
result = null;
}
}
void applyFailed() {
AsyncCallback<T> cb = delegate;
if (cb != null) {
delegate = null;
result = null;
cb.onFailure(failedThrowable);
}
}
}
}