summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Murashkin <iam@google.com>2019-11-13 12:10:01 -0800
committerandroid-build-merger <android-build-merger@google.com>2019-11-13 12:10:01 -0800
commit68b9bbe7851c0d5cc02629e13bc263d2462644a0 (patch)
tree15ac6f89ad47dc0cbdcf740c91b0c0829d86c137
parenta7ed673121a1594551fa0dfbece4b065a2a56d80 (diff)
parent37d2a9fffbbd702bb2c8cb74259090ad2bfb7818 (diff)
downloadRxCpp-68b9bbe7851c0d5cc02629e13bc263d2462644a0.tar.gz
observable: Fix dangling use in #as_blocking am: f2bfb6033aandroid-r-preview-4android-r-preview-3android-r-preview-2
am: 37d2a9fffb Change-Id: Ib28c57e817c0d46aee32825de6d5d5da43203e46
-rw-r--r--Rx/v2/src/rxcpp/rx-observable.hpp14
1 files changed, 9 insertions, 5 deletions
diff --git a/Rx/v2/src/rxcpp/rx-observable.hpp b/Rx/v2/src/rxcpp/rx-observable.hpp
index 4f42007..7e3d567 100644
--- a/Rx/v2/src/rxcpp/rx-observable.hpp
+++ b/Rx/v2/src/rxcpp/rx-observable.hpp
@@ -174,22 +174,26 @@ class blocking_observable
std::mutex lock;
std::condition_variable wake;
bool disposed = false;
- rxu::error_ptr error;
auto dest = make_subscriber<T>(std::forward<ArgN>(an)...);
+ rxu::error_ptr error;
+ bool has_error = false;
+
// keep any error to rethrow at the end.
+ // copy 'dest' by-value to avoid using it after it goes out of scope.
auto scbr = make_subscriber<T>(
dest,
- [&](T t){dest.on_next(t);},
- [&](rxu::error_ptr e){
+ [dest](T t){dest.on_next(t);},
+ [dest,&error,&has_error,do_rethrow](rxu::error_ptr e){
if (do_rethrow) {
+ has_error = true;
error = e;
} else {
dest.on_error(e);
}
},
- [&](){dest.on_completed();}
+ [dest](){dest.on_completed();}
);
auto cs = scbr.get_subscription();
@@ -208,7 +212,7 @@ class blocking_observable
return disposed;
});
- if (error) {rxu::rethrow_exception(error);}
+ if (has_error) {rxu::rethrow_exception(error);}
}
public: