ESource emits property change signals in the source_registry_object_manager_thread() thread
This was a tough nut to crack.
I was investigating a crash in Calendar, and wrote some thread validation helpers as part of that. These validation functions exposed something unexpected (which may or may not be the source of the crashes - I don't know yet).
ESourceRegistry spawns a thread to communicate with the D-Bus server, and tries really hard to emit signals and property changes in the GMainContext in which it was created. This is its documented behaviour, even: https://gitlab.gnome.org/GNOME/evolution-data-server/-/blob/master/src/libedataserver/e-source-registry.c#L39-41
However, I think it was bitten by the D-Bus generated code. The recent patches in Calendar gave the following callstack:
Thread 7 "gnome-calendar" received signal SIGABRT, Aborted.
[Switching to Thread 0x7fffeb7fe6c0 (LWP 28)]
0x00007ffff6a90e14 in __pthread_kill_implementation () from /usr/lib/x86_64-linux-gnu/libc.so.6
> bt
#0 0x00007ffff6a90e14 in __pthread_kill_implementation () at /usr/lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff6a3edce in raise () at /usr/lib/x86_64-linux-gnu/libc.so.6
#2 0x00007ffff6a2683f in abort () at /usr/lib/x86_64-linux-gnu/libc.so.6
#3 0x00007ffff70dff4b in g_assertion_message_expr[cold] () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#4 0x00007ffff714a0f7 in g_assertion_message_expr () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#5 0x00005555555cb452 in remove_all_events (self=0x55555734d190) at ../src/core/gcal-calendar-monitor.c:1019
#6 0x00005555555cbe81 in on_calendar_visible_changed_cb (calendar=0x5555557a59f0, pspec=0x555555695930, self=0x55555734d190) at ../src/core/gcal-calendar-monitor.c:1200
#7 0x00007ffff707043a in g_closure_invoke () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#8 0x00007ffff708496c in signal_emit_unlocked_R.isra.0 () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#9 0x00007ffff70863f1 in signal_emit_valist_unlocked () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#10 0x00007ffff708c3c1 in g_signal_emit_valist () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#11 0x00007ffff708c483 in g_signal_emit () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#12 0x00007ffff7074a94 in g_object_dispatch_properties_changed () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#13 0x00007ffff7077c07 in g_object_notify_by_pspec () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#14 0x0000555555586992 in on_source_visible_changed_cb (source=0x5555557d9440, pspec=0x5555557706c0, self=0x5555557a59f0) at ../src/core/gcal-calendar.c:146
#15 0x00007ffff707043a in g_closure_invoke () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#16 0x00007ffff708496c in signal_emit_unlocked_R.isra.0 () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#17 0x00007ffff70863f1 in signal_emit_valist_unlocked () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#18 0x00007ffff708c3c1 in g_signal_emit_valist () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#19 0x00007ffff708c483 in g_signal_emit () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#20 0x00007ffff7074a94 in g_object_dispatch_properties_changed () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#21 0x00007ffff7075448 in g_object_notify_queue_thaw () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#22 0x00007ffff7077d5e in g_object_thaw_notify () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#23 0x00007ffff6e299fc in source_load_from_key_file (object=0x5555557d9440, key_file=key_file@entry=0x7fffd40ffc90, group_name=0x5555556ffeb0 "Calendar") at /run/build/evolution-data-server/src/libedataserver/e-source.c:702
#24 0x00007ffff6e2a4a8 in source_parse_dbus_data (source=source@entry=0x7fffd40ffc30, error=error@entry=0x7fffeb7fcde0) at /run/build/evolution-data-server/src/libedataserver/e-source.c:789
#25 0x00007ffff6e2a680 in source_notify_dbus_data_cb (dbus_source=<optimized out>, pspec=<optimized out>, source=0x7fffd40ffc30) at /run/build/evolution-data-server/src/libedataserver/e-source.c:806
#26 0x00007ffff707043a in g_closure_invoke () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#27 0x00007ffff708496c in signal_emit_unlocked_R.isra.0 () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#28 0x00007ffff70863f1 in signal_emit_valist_unlocked () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#29 0x00007ffff708c3c1 in g_signal_emit_valist () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#30 0x00007ffff708c483 in g_signal_emit () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#31 0x00007ffff7074a94 in g_object_dispatch_properties_changed () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#32 0x00007ffff7077b0f in g_object_notify () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#33 0x00007ffff59e5c6c in e_dbus_source_proxy_g_properties_changed (_proxy=0x7fffd400bef0, changed_properties=<optimized out>, invalidated_properties=0x7fffe0045650) at /run/build/evolution-data-server/src/private/e-dbus-source.c:1709
#34 0x00007ffff707043a in g_closure_invoke () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#35 0x00007ffff7084ff8 in signal_emit_unlocked_R.isra.0 () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#36 0x00007ffff70863f1 in signal_emit_valist_unlocked () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#37 0x00007ffff708c698 in g_signal_emit_by_name () at /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0
#38 0x00007ffff734dc51 in signal_cb () at /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0
#39 0x00007ffff7329240 in emit_signal_instance_in_idle_cb () at /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0
#40 0x00007ffff711ac97 in g_main_dispatch () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#41 0x00007ffff711cda7 in g_main_context_iterate_unlocked.isra () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#42 0x00007ffff711d757 in g_main_loop_run () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#43 0x00007ffff6e45716 in source_registry_object_manager_thread (data=0x5555557b8570) at /run/build/evolution-data-server/src/libedataserver/e-source-registry.c:1167
#44 0x00007ffff714bcb9 in g_thread_proxy () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#45 0x00007ffff6a8ee39 in start_thread () at /usr/lib/x86_64-linux-gnu/libc.so.6
#46 0x00007ffff6b16cc4 in clone () at /usr/lib/x86_64-linux-gnu/libc.so.6
Notice that:
- The thread is Thread 7
- It seems to come from D-Bus generated code (
e_dbus_source_proxy_g_properties_changed
) - It completely bypasses
registry->priv->main_context
- The signal in question comes from
ESourceSelectable
, and that'snotify::selected