g_test_dbus_down() while a name is being watched => warning, test fails
Submitted by Simon McVittie
Assigned to David Zeuthen
Link to original bug (#726978)
Description
Since g_test_dbus_down() started prematurely disposing the GDBusConnection in 2.39.1 (Bug #711807), if a name-owner watch is cancelled while g_test_dbus_down() is waiting for the GDBusConnection to run out of references, the name-owner-watching code will trip a GObject warning, which defaults to being fatal while running regression tests.
Here's an example of the backtrace:
#0 g_logv (log_domain=0x2aaaaeac0177 "GLib-GObject", log_level=G_LOG_LEVEL_WARNING, format=<optimized out>, args=args@entry=0x7fffffffdb38) at /build/glib2.0-V5GbKs/glib2.0-2.39.92/./glib/gmessages.c:1038
#1 0x00002aaaaed27d72 in g_log (log_domain=log_domain@entry=0x2aaaaeac0177 "GLib-GObject", log_level=log_level@entry=G_LOG_LEVEL_WARNING, format=format@entry=0x2aaaaeac5128 "%s: instance '%p' has no handler with id '%lu'") at /build/glib2.0-V5GbKs/glib2.0-2.39.92/./glib/gmessages.c:1071
#2 0x00002aaaaeaa7167 in g_signal_handler_disconnect (instance=0x2aaab80090b0, handler_id=174) at /build/glib2.0-V5GbKs/glib2.0-2.39.92/./gobject/gsignal.c:2580
#3 0x00002aaaae5361ed in client_unref (client=0x2aaac400d4d0) at /build/glib2.0-V5GbKs/glib2.0-2.39.92/./gio/gdbusnamewatching.c:100
#4 0x00002aaaab8152f0 in book_client_finalize (object=0x675e00) at e-book-client.c:545
#5 0x00002aaaaea9bdba in g_object_unref (_object=0x675e00) at /build/glib2.0-V5GbKs/glib2.0-2.39.92/./gobject/gobject.c:3112
#6 0x00002aaaab819a69 in book_client_view_dispose (object=0x2aaab805bc40) at e-book-client-view.c:794
#7 0x00002aaaaea9bd2c in g_object_unref (_object=0x2aaab805bc40) at /build/glib2.0-V5GbKs/glib2.0-2.39.92/./gobject/gobject.c:3075
#8 0x00002aaaab18444f in edsf_persona_store_finalize (obj=0x2aaab8009980) at /home/smcv/src/gnome/folks-tp/backends/eds/lib/edsf-persona-store.vala:52
#9 0x00002aaaaea9bdba in g_object_unref (_object=0x2aaab8009980) at /build/glib2.0-V5GbKs/glib2.0-2.39.92/./gobject/gobject.c:3112
#10 0x00002aaaae814acf in ?? () from /usr/lib/x86_64-linux-gnu/libgee-0.8.so.2
#11 0x00002aaaae815b72 in ?? () from /usr/lib/x86_64-linux-gnu/libgee-0.8.so.2
#12 0x00002aaaaea9bdba in g_object_unref (_object=0x63f7b0) at /build/glib2.0-V5GbKs/glib2.0-2.39.92/./gobject/gobject.c:3112
#13 0x00002aaaaad0e302 in folks_individual_aggregator_finalize (obj=0x6413c0) at /home/smcv/src/gnome/folks-tp/folks/individual-aggregator.vala:128
#14 0x00002aaaaea9bdba in g_object_unref (_object=0x6413c0) at /build/glib2.0-V5GbKs/glib2.0-2.39.92/./gobject/gobject.c:3112
#15 0x0000000000406f66 in individual_retrieval_tests_finalize (obj=0x627070) at /home/smcv/src/gnome/folks-tp/tests/eds/individual-retrieval.vala:28
#16 0x00002aaaaea9bdba in g_object_unref (_object=0x627070) at /build/glib2.0-V5GbKs/glib2.0-2.39.92/./gobject/gobject.c:3112
#17 0x0000000000407003 in _vala_main (args=0x7fffffffdf68, args_length1=1) at /home/smcv/src/gnome/folks-tp/tests/eds/individual-retrieval.vala:128
#18 0x00002aaaaf21eb45 in __libc_start_main (main=0x4060b0 <main>, argc=1, argv=0x7fffffffdf68, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffdf58) at libc-start.c:287
#19 0x00000000004060f9 in _start ()
I think this is because g_object_real_dispose() clears all signal handlers, making it an error to disconnect them explicitly.
I can't see how the name-owner-watching code could deal with this, apart from by using a GWeakRef to detect disposal (g_object_add_weak_pointer doesn't work because that only happens in finalize).
Another solution would be for GTestDBus to stop forcibly disposing the connection.
Version: 2.39.x