diff options
| author | Igor Murashkin <iam@google.com> | 2019-11-13 12:12:29 -0800 |
|---|---|---|
| committer | android-build-merger <android-build-merger@google.com> | 2019-11-13 12:12:29 -0800 |
| commit | 439b0fad1d24972948f96f58a8931ebe72d0ab29 (patch) | |
| tree | 15ac6f89ad47dc0cbdcf740c91b0c0829d86c137 | |
| parent | 1222f0344b28cef8d7d75215ac1b3084c31b54dd (diff) | |
| parent | 68b9bbe7851c0d5cc02629e13bc263d2462644a0 (diff) | |
| download | platform_external_Reactive-Extensions_RxCpp-android11-mainline-release.tar.gz platform_external_Reactive-Extensions_RxCpp-android11-mainline-release.tar.bz2 platform_external_Reactive-Extensions_RxCpp-android11-mainline-release.zip | |
observable: Fix dangling use in #as_blocking am: f2bfb6033a am: 37d2a9fffbandroid-mainline-11.0.0_r1android11-mainline-releaseandroid11-dev
am: 68b9bbe785
Change-Id: I49129dd47fd96e1de0c8caf7cdb48760ade71f86
| -rw-r--r-- | Rx/v2/src/rxcpp/rx-observable.hpp | 14 |
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: |
