diff options
author | Kjell Ahlstedt <kjellahlstedt@gmail.com> | 2017-07-17 10:18:02 +0200 |
---|---|---|
committer | Kjell Ahlstedt <kjellahlstedt@gmail.com> | 2017-07-17 10:18:02 +0200 |
commit | abadda40f1732cb88f4a91335d2be1bb95b89a92 (patch) | |
tree | 738553c2ce3112707ab4f4b17a4b50dc1109b14f | |
parent | 661f12a1e7c21378dc194ce527bdd6c192629481 (diff) | |
download | sigc++-abadda40f1732cb88f4a91335d2be1bb95b89a92.tar.gz |
signal_impl::clear(): Don't clear the slot list during signal emission
If signal_impl::clear() is called during signal emission, don't call
slots_.clear(). Let signal_impl::sweep() erase all slots after the signal
emission. Bug 784550
-rw-r--r-- | sigc++/signal_base.cc | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/sigc++/signal_base.cc b/sigc++/signal_base.cc index cc8342b..bf9aa37 100644 --- a/sigc++/signal_base.cc +++ b/sigc++/signal_base.cc @@ -54,6 +54,7 @@ void signal_impl::clear() { // Don't let signal_impl::notify() erase the slots. It would invalidate the // iterator in the following loop. + const bool during_signal_emission = exec_count_ > 0; const bool saved_deferred = deferred_; signal_exec exec(this); @@ -62,9 +63,15 @@ void signal_impl::clear() for (auto& slot : slots_) slot.disconnect(); - deferred_ = saved_deferred; - - slots_.clear(); + // Don't clear slots_ during signal emission. Provided deferred_ is true, + // sweep() will be called from ~signal_exec() after signal emission, + // and it will erase all disconnected slots. + // https://bugzilla.gnome.org/show_bug.cgi?id=784550 + if (!during_signal_emission) + { + deferred_ = saved_deferred; + slots_.clear(); + } } signal_impl::size_type signal_impl::size() const noexcept |