From ea9eb62802193654d3deee968b51b658b7005e6c Mon Sep 17 00:00:00 2001 From: "Vicente J. Botet Escriba" Date: Tue, 29 Sep 2015 21:57:52 +0200 Subject: [PATCH] fix shared_state_nullary_task_lifetime_issue_bad_use_of_direct_pointer. --- include/boost/thread/future.hpp | 63 +++++++++++++++++---------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/include/boost/thread/future.hpp b/include/boost/thread/future.hpp index 49810bbc..3d67df47 100644 --- a/include/boost/thread/future.hpp +++ b/include/boost/thread/future.hpp @@ -3662,14 +3662,13 @@ namespace detail { template struct shared_state_nullary_task { - shared_state* that; + shared_ptr that; Fp f_; public: - shared_state_nullary_task(shared_state* st, BOOST_THREAD_FWD_REF(Fp) f) + shared_state_nullary_task(shared_ptr st, BOOST_THREAD_FWD_REF(Fp) f) : that(st), f_(boost::move(f)) {}; -#if ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES) BOOST_THREAD_COPYABLE_AND_MOVABLE(shared_state_nullary_task) shared_state_nullary_task(shared_state_nullary_task const& x) //BOOST_NOEXCEPT : that(x.that), f_(x.f_) @@ -3686,23 +3685,23 @@ namespace detail { shared_state_nullary_task(BOOST_THREAD_RV_REF(shared_state_nullary_task) x) //BOOST_NOEXCEPT : that(x.that), f_(boost::move(x.f_)) { - x.that=0; + x.that.reset(); } shared_state_nullary_task& operator=(BOOST_THREAD_RV_REF(shared_state_nullary_task) x) //BOOST_NOEXCEPT { if (this != &x) { that=x.that; f_=boost::move(x.f_); - x.that=0; + x.that.reset(); } return *this; } -#endif void operator()() { + shared_ptr> that_ = dynamic_pointer_cast>(that); try { - that->mark_finished_with_result(f_()); + that_->mark_finished_with_result(f_()); } catch(...) { - that->mark_exceptional_finish(); + that_->mark_exceptional_finish(); } } }; @@ -3710,13 +3709,12 @@ namespace detail { template struct shared_state_nullary_task { - shared_state* that; + shared_ptr that; Fp f_; public: - shared_state_nullary_task(shared_state* st, BOOST_THREAD_FWD_REF(Fp) f) + shared_state_nullary_task(shared_ptr st, BOOST_THREAD_FWD_REF(Fp) f) : that(st), f_(boost::move(f)) {}; -#if ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES) BOOST_THREAD_COPYABLE_AND_MOVABLE(shared_state_nullary_task) shared_state_nullary_task(shared_state_nullary_task const& x) //BOOST_NOEXCEPT : that(x.that), f_(x.f_) @@ -3733,23 +3731,23 @@ namespace detail { shared_state_nullary_task(BOOST_THREAD_RV_REF(shared_state_nullary_task) x) BOOST_NOEXCEPT : that(x.that), f_(boost::move(x.f_)) { - x.that=0; + x.that.reset(); } shared_state_nullary_task& operator=(BOOST_THREAD_RV_REF(shared_state_nullary_task) x) BOOST_NOEXCEPT { if (this != &x) { that=x.that; f_=boost::move(x.f_); - x.that=0; + x.that.reset(); } return *this; } -#endif void operator()() { + shared_ptr> that_ = dynamic_pointer_cast>(that); try { f_(); - that->mark_finished_with_result(); + that_->mark_finished_with_result(); } catch(...) { - that->mark_exceptional_finish(); + that_->mark_exceptional_finish(); } } }; @@ -3757,13 +3755,12 @@ namespace detail { template struct shared_state_nullary_task { - shared_state* that; + shared_ptr that; Fp f_; public: - shared_state_nullary_task(shared_state* st, BOOST_THREAD_FWD_REF(Fp) f) + shared_state_nullary_task(shared_ptr st, BOOST_THREAD_FWD_REF(Fp) f) : that(st), f_(boost::move(f)) {} -#if ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES) BOOST_THREAD_COPYABLE_AND_MOVABLE(shared_state_nullary_task) shared_state_nullary_task(shared_state_nullary_task const& x) BOOST_NOEXCEPT : that(x.that), f_(x.f_) {} @@ -3779,22 +3776,22 @@ namespace detail { shared_state_nullary_task(BOOST_THREAD_RV_REF(shared_state_nullary_task) x) BOOST_NOEXCEPT : that(x.that), f_(boost::move(x.f_)) { - x.that=0; + x.that.reset(); } shared_state_nullary_task& operator=(BOOST_THREAD_RV_REF(shared_state_nullary_task) x) BOOST_NOEXCEPT { if (this != &x) { that=x.that; f_=boost::move(x.f_); - x.that=0; + x.that.reset(); } return *this; } -#endif void operator()() { + shared_ptr> that_ = dynamic_pointer_cast>(that); try { - that->mark_finished_with_result(f_()); + that_->mark_finished_with_result(f_()); } catch(...) { - that->mark_exceptional_finish(); + that_->mark_exceptional_finish(); } } }; @@ -3802,16 +3799,20 @@ namespace detail { ///////////////////////// /// future_executor_shared_state_base ///////////////////////// - template + template struct future_executor_shared_state: shared_state { typedef shared_state base_type; protected: public: - template - future_executor_shared_state(Executor& ex, BOOST_THREAD_FWD_REF(Fp) f) { + future_executor_shared_state() { this->set_executor(); - shared_state_nullary_task t(this, boost::forward(f)); + } + + template + void init(Executor& ex, BOOST_THREAD_FWD_REF(Fp) f) + { + shared_state_nullary_task t(this->shared_from_this(), boost::forward(f)); ex.submit(boost::move(t)); } @@ -3822,15 +3823,15 @@ namespace detail { ~future_executor_shared_state() {} }; - //////////////////////////////// // make_future_executor_shared_state //////////////////////////////// template BOOST_THREAD_FUTURE make_future_executor_shared_state(Executor& ex, BOOST_THREAD_FWD_REF(Fp) f) { - shared_ptr > - h(new future_executor_shared_state(ex, boost::forward(f))); + shared_ptr > + h(new future_executor_shared_state()); + h->init(ex, boost::forward(f)); return BOOST_THREAD_FUTURE(h); }