[libsigc++2] slot_rep::disconnect(): Remove a comment, add a test
- From: Kjell Ahlstedt <kjellahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsigc++2] slot_rep::disconnect(): Remove a comment, add a test
- Date: Sun, 11 Oct 2015 13:17:22 +0000 (UTC)
commit 54b5c013552e753fad02c879ace7d0f7f91f33b6
Author: Kjell Ahlstedt <kjell ahlstedt bredband net>
Date: Sun Oct 11 15:12:10 2015 +0200
slot_rep::disconnect(): Remove a comment, add a test
* sigc++/functors/slot_base.cc: Remove a TODO comment at slot_rep::disconnect().
* tests/test_slot_disconnect.cc: Add a test that assigns an empty slot.
sigc++/functors/slot_base.cc | 19 +++++++++----------
tests/test_slot_disconnect.cc | 5 ++++-
2 files changed, 13 insertions(+), 11 deletions(-)
---
diff --git a/sigc++/functors/slot_base.cc b/sigc++/functors/slot_base.cc
index 2bc0d40..88a91f9 100644
--- a/sigc++/functors/slot_base.cc
+++ b/sigc++/functors/slot_base.cc
@@ -55,23 +55,22 @@ void slot_rep::operator delete(void* p)
}
#endif
-//TODO: When we can break API: Is it necessary to invalidate the slot here?
-// If the parent misbehaves, when the slot is not invalidated, isn't that
-// a problem that should be fixed in the parent?
-// See discussion in https://bugzilla.gnome.org/show_bug.cgi?id=738602
void slot_rep::disconnect()
{
+ // Invalidate the slot.
+ // _Must_ be done here because parent_ might defer the actual
+ // destruction of the slot_rep and try to invoke it before that point.
+ // Must be done also for a slot without a parent, according to
+ // https://bugzilla.gnome.org/show_bug.cgi?id=311057
+ // See also https://bugzilla.gnome.org/show_bug.cgi?id=738602
+ call_ = nullptr;
+
if (parent_)
{
- call_ = nullptr; // Invalidate the slot.
- // _Must_ be done here because parent_ might defer the actual
- // destruction of the slot_rep and try to invoke it before that point.
auto data_ = parent_;
- parent_ = nullptr; // Just a precaution.
+ parent_ = nullptr; // Just a precaution.
(cleanup_)(data_); // Notify the parent (might lead to destruction of this!).
}
- else
- call_ = nullptr;
}
//static
diff --git a/tests/test_slot_disconnect.cc b/tests/test_slot_disconnect.cc
index 13d42e0..a1d6834 100644
--- a/tests/test_slot_disconnect.cc
+++ b/tests/test_slot_disconnect.cc
@@ -1,4 +1,3 @@
-// -*- c++ -*-
/* Copyright 2005, The libsigc++ Development Team
* Assigned to public domain. Use as you wish without restriction.
*/
@@ -45,5 +44,9 @@ int main(int argc, char* argv[])
theSlot();
util->check_result(result_stream, "Bar");
+ theSlot = sigc::slot<void>(); // Assign an empty slot.
+ theSlot();
+ util->check_result(result_stream, "");
+
return util->get_result_and_delete_instance() ? EXIT_SUCCESS : EXIT_FAILURE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]