deadlock as calling g_cancellable_disconnect inside cancelled handler
@prahal
Submitted by Alban Browaeys Link to original bug (#705395)
Description
Created attachment 250758 move cancelled handler code out to main context
The following deadlock happens. Patch to fix it (based on alike evolution code) is attached. I moved more (ie the whole code inside the handler).
Thread 4 (Thread 0x7fffe3404700 (LWP 2178)):
#0 0x00007ffff3e6f85e in fast_validate (str=0x7fffd800a280 "org.gnome.OnlineAccounts.Account") at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gutf8.c:1453
#1 0x00007ffff3e6fafd in g_utf8_validate (str=0x7fffd800a280 "org.gnome.OnlineAccounts.Account", max_len=-1, end=0x7fffe3402fb0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gutf8.c:1621
#2 0x00007ffff46d2eff in read_string (mbuf=0x7fffe3403830, len=32, error=0x7fffe34030b0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gdbusmessage.c:1408
#3 0x00007ffff46d34a0 in parse_value_from_blob (buf=0x7fffe3403830, type=0x7fffd80182f0, just_align=0, indent=8, error=0x7fffe3403290) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gdbusmessage.c:1594
#4 0x00007ffff46d3d15 in parse_value_from_blob (buf=0x7fffe3403831, type=0x7ffff473b4eb, just_align=0, indent=6, error=0x7fffe3403470) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gdbusmessage.c:1856
#5 0x00007ffff46d3a52 in parse_value_from_blob (buf=0x7fffe3403830, type=0x7ffff473b4e9, just_align=0, indent=4, error=0x7fffe3403650) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gdbusmessage.c:1773
#6 0x00007ffff46d38db in parse_value_from_blob (buf=0x7fffe3403830, type=0x7ffff473b4e8, just_align=0, indent=2, error=0x7fffe34038f0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gdbusmessage.c:1726
#7 0x00007ffff46d4330 in g_dbus_message_new_from_blob (blob=0x7fffd800a200 "l\001", blob_len=200, capabilities=G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING, error=0x7fffe34038f0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gdbusmessage.c:2095
#8 0x00007ffff46e0960 in _g_dbus_worker_do_read_cb (input_stream=0x7fffd4008130 [GSocket], res=0x7fffd8003310, user_data=0x7fffd400fe90) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gdbusprivate.c:754
#9 0x00007ffff465b80b in g_simple_async_result_complete (simple=0x7fffd8003310 [GSimpleAsyncResult]) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gsimpleasyncresult.c:777
#10 0x00007ffff465b857 in complete_in_idle_cb (data=0x7fffd8003310) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gsimpleasyncresult.c:789
#11 0x00007ffff3e382e1 in g_idle_dispatch (source=0x7fffd8019440, callback=0x7ffff465b824 <complete_in_idle_cb>, user_data=0x7fffd8003310) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:5250
#12 0x00007ffff3e35ae5 in g_main_dispatch (context=0x7fffd400e5a0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:3065
#13 0x00007ffff3e3683c in g_main_context_dispatch (context=0x7fffd400e5a0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:3641
#14 0x00007ffff3e36a2e in g_main_context_iterate (context=0x7fffd400e5a0, block=1, dispatch=1, self=0x634ad0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:3712
#15 0x00007ffff3e36e57 in g_main_loop_run (loop=0x7fffd400e530) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:3906
#16 0x00007ffff46dfdf9 in gdbus_shared_thread_func (user_data=0x7fffd400e570) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gdbusprivate.c:278
#17 0x00007ffff3e635ae in g_thread_proxy (data=0x634ad0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gthread.c:798
#18 0x00007ffff3bcee0e in start_thread (arg=0x7fffe3404700) at pthread_create.c:311
#19 0x00007ffff390393d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
Thread 3 (Thread 0x7fffe3c05700 (LWP 2177)):
#0 pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:185
#1 0x00007ffff3e87eee in g_cond_wait (cond=0x7ffff497e190 <cancellable_cond>, mutex=0x7ffff497e180 <cancellable_mutex>) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gthread-posix.c:753
#2 0x00007ffff460dc01 in g_cancellable_disconnect (cancellable=0x7fffd8018410 [GCancellable], handler_id=59) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gcancellable.c:619
#3 0x00007ffff460dcf9 in cancellable_source_finalize (source=0x7fffd402a8e0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gcancellable.c:663
#4 0x00007ffff3e34c99 in g_source_unref_internal (source=0x7fffd402a8e0, context=0x633690, have_lock=1) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:1996
#5 0x00007ffff3e34188 in g_child_source_remove_internal (child_source=0x7fffd402a8e0, context=0x633690) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:1451
#6 0x00007ffff3e33b83 in g_source_destroy_internal (source=0x7fffd402a780, context=0x633690, have_lock=0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:1226
#7 0x00007ffff3e33c3d in g_source_destroy (source=0x7fffd402a780) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:1256
#8 0x000000000041782d in clear_scheduled_timer_wakeups (self=0x7fffd4007b70 [GoaAlarm]) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/gnome-online-accounts/src/goaidentity/goaalarm.c:113
#9 0x00000000004179a7 in clear_scheduled_wakeups (self=0x7fffd4007b70 [GoaAlarm]) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/gnome-online-accounts/src/goaidentity/goaalarm.c:143
#10 0x0000000000417f8d in on_cancelled (cancellable=0x7fffd8018410 [GCancellable], user_data=0x7fffd4007b70) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/gnome-online-accounts/src/goaidentity/goaalarm.c:264
#11 0x00007ffff41459e3 in g_cclosure_marshal_VOID__VOID (closure=0x7fffd4025320, return_value=0x0, n_param_values=1, param_values=0x7fffe3c044b0, invocation_hint=0x7fffe3c043e0, marshal_data=0x0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gmarshal.c:85
#12 0x00007ffff4142a0d in g_closure_invoke (closure=0x7fffd4025320, return_value=0x0, n_param_values=1, param_values=0x7fffe3c044b0, invocation_hint=0x7fffe3c043e0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gclosure.c:777
#13 0x00007ffff4160b98 in signal_emit_unlocked_R (node=0x7fffd400dcf0, detail=0, instance=0x7fffd8018410, emission_return=0x0, instance_and_params=0x7fffe3c044b0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gsignal.c:3582
#14 0x00007ffff415fde4 in g_signal_emit_valist (instance=0x7fffd8018410, signal_id=4, detail=0, var_args=0x7fffe3c04778) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gsignal.c:3326
#15 0x00007ffff4160337 in g_signal_emit (instance=0x7fffd8018410, signal_id=4, detail=0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gsignal.c:3382
#16 0x00007ffff460da19 in g_cancellable_cancel (cancellable=0x7fffd8018410 [GCancellable]) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gcancellable.c:503
#17 0x00000000004188df in goa_alarm_set_time (self=0x7fffd4007b70 [GoaAlarm], time=0x6680a0, cancellable=0x7fffd8017050 [GCancellable]) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/gnome-online-accounts/src/goaidentity/goaalarm.c:561
#18 0x0000000000411b66 in set_alarm (self=0x7fffd4004b70 [GoaKerberosIdentity], alarm=0x7fffd4007b70 [GoaAlarm], alarm_time=0x6680a0, cancellable=0x7fffd4004b58) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/gnome-online-accounts/src/goaidentity/goakerberosidentity.c:815
#19 0x0000000000411fda in reset_alarms (self=0x7fffd4004b70 [GoaKerberosIdentity]) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/gnome-online-accounts/src/goaidentity/goakerberosidentity.c:901
#20 0x0000000000412dba in goa_kerberos_identity_update (self=0x7fffd4004b70 [GoaKerberosIdentity], new_identity=0x7fffd4004c00 [GoaKerberosIdentity]) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/gnome-online-accounts/src/goaidentity/goakerberosidentity.c:1375
#21 0x0000000000414e84 in update_identity (self=0x664ca0 [GoaKerberosIdentityManager], operation=0x7fffd4022440, identity=0x7fffd4004b70, new_identity=0x7fffd4004c00) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/gnome-online-accounts/src/goaidentity/goakerberosidentitymanager.c:423
#22 0x000000000041506e in refresh_identity (self=0x664ca0 [GoaKerberosIdentityManager], operation=0x7fffd4022440, refreshed_identities=0x7fffd401da40, identity=0x7fffd4004c00) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/gnome-online-accounts/src/goaidentity/goakerberosidentitymanager.c:489
#23 0x000000000041528b in refresh_identities (self=0x664ca0 [GoaKerberosIdentityManager], operation=0x7fffd4022440) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/gnome-online-accounts/src/goaidentity/goakerberosidentitymanager.c:557
#24 0x00000000004160dc in on_job_scheduled (job=0x6746c0, cancellable=0x67e8e0 [GCancellable], self=0x664ca0 [GoaKerberosIdentityManager]) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/gnome-online-accounts/src/goaidentity/goakerberosidentitymanager.c:993
#25 0x00007ffff46422f5 in io_job_thread (task=0x63caa0 [GTask], source_object=0x0, task_data=0x6746c0, cancellable=0x67e8e0 [GCancellable]) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gioscheduler.c:89
#26 0x00007ffff466d335 in g_task_thread_pool_thread (thread_data=0x63caa0, pool_data=0x0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gio/gtask.c:1245
#27 0x00007ffff3e63b9e in g_thread_pool_thread_proxy (data=0x63a920) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gthreadpool.c:309
#28 0x00007ffff3e635ae in g_thread_proxy (data=0x634450) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gthread.c:798
#29 0x00007ffff3bcee0e in start_thread (arg=0x7fffe3c05700) at pthread_create.c:311
#30 0x00007ffff390393d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
Thread 2 (Thread 0x7fffe4406700 (LWP 2176)):
#0 0x00007ffff38f819d in poll () at ../sysdeps/unix/syscall-template.S:81
#1 0x00007ffff3e47b26 in g_poll (fds=0x7fffdc0008e0, nfds=2, timeout=-1) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gpoll.c:132
#2 0x00007ffff3e37073 in g_main_context_poll (context=0x6340c0, timeout=-1, priority=2147483647, fds=0x7fffdc0008e0, n_fds=2) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:4006
#3 0x00007ffff3e36a03 in g_main_context_iterate (context=0x6340c0, block=1, dispatch=1, self=0x634400) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:3707
#4 0x00007ffff3e36af2 in g_main_context_iteration (context=0x6340c0, may_block=1) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:3773
#5 0x00007ffff3e385aa in glib_worker_main (data=0x0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:5472
#6 0x00007ffff3e635ae in g_thread_proxy (data=0x634400) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gthread.c:798
#7 0x00007ffff3bcee0e in start_thread (arg=0x7fffe4406700) at pthread_create.c:311
#8 0x00007ffff390393d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
Thread 1 (Thread 0x7ffff7fc1a00 (LWP 1605)):
#0 __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
#1 0x00007ffff3bd0f72 in _L_lock_1134 () from /lib/x86_64-linux-gnu/libpthread.so.0
#2 0x00007ffff3bd0ef0 in __GI___pthread_mutex_lock (mutex=0x7fffd40252d0) at pthread_mutex_lock.c:104
#3 0x00007ffff3e87926 in g_mutex_lock (mutex=0x624ce8 <g__identity_lock_lock>) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gthread-posix.c:213
#4 0x0000000000410119 in goa_kerberos_identity_get_property (object=0x7fffd4004b70 [GoaKerberosIdentity], property_id=3, value=0x7fffffffb980, param_spec=0x7fffd40079b0 [GParamInt64]) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/gnome-online-accounts/src/goaidentity/goakerberosidentity.c:170
#5 0x00007ffff414a503 in object_get_property (object=0x7fffd4004b70 [GoaKerberosIdentity], pspec=0x7fffd40079b0 [GParamInt64], value=0x7fffffffb980) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gobject.c:1300
#6 0x00007ffff414d55f in g_object_get_property (object=0x7fffd4004b70 [GoaKerberosIdentity], property_name=0x63d820 "expiration-timestamp", value=0x7fffffffb980) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gobject.c:2399
#7 0x00007ffff413d618 in on_source_notify (gobject=0x7fffd4004b70 [GoaKerberosIdentity], pspec=0x7fffd40079b0 [GParamInt64], binding=0x7fffd4022240 [GBinding]) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gbinding.c:378
#8 0x00007ffff4146fbc in g_cclosure_marshal_VOID__PARAM (closure=0x673ab0, return_value=0x0, n_param_values=2, param_values=0x7fffffffbc10, invocation_hint=0x7fffffffbb40, marshal_data=0x0) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gmarshal.c:1042
#9 0x00007ffff4142a0d in g_closure_invoke (closure=0x673ab0, return_value=0x0, n_param_values=2, param_values=0x7fffffffbc10, invocation_hint=0x7fffffffbb40) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gclosure.c:777
#10 0x00007ffff4160b98 in signal_emit_unlocked_R (node=0x635ab0, detail=468, instance=0x7fffd4004b70, emission_return=0x0, instance_and_params=0x7fffffffbc10) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gsignal.c:3582
#11 0x00007ffff415fde4 in g_signal_emit_valist (instance=0x7fffd4004b70, signal_id=1, detail=468, var_args=0x7fffffffbee8) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gsignal.c:3326
#12 0x00007ffff4160337 in g_signal_emit (instance=0x7fffd4004b70, signal_id=1, detail=468) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gsignal.c:3382
#13 0x00007ffff4149e0a in g_object_dispatch_properties_changed (object=0x7fffd4004b70 [GoaKerberosIdentity], n_pspecs=1, pspecs=0x7fffffffc020) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gobject.c:1047
#14 0x00007ffff414a0a9 in g_object_notify_by_spec_internal (object=0x7fffd4004b70 [GoaKerberosIdentity], pspec=0x7fffd401bd40 [GParamOverride]) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gobject.c:1141
#15 0x00007ffff414a203 in g_object_notify (object=0x7fffd4004b70 [GoaKerberosIdentity], property_name=0x41cb61 "expiration-timestamp") at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/gobject/gobject.c:1183
#16 0x0000000000410c7b in on_notify_queued (request=0x648f00) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/gnome-online-accounts/src/goaidentity/goakerberosidentity.c:518
#17 0x00007ffff3e382e1 in g_idle_dispatch (source=0x7fffd4030a20, callback=0x410c47 <on_notify_queued>, user_data=0x648f00) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:5250
#18 0x00007ffff3e35ae5 in g_main_dispatch (context=0x633690) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:3065
#19 0x00007ffff3e3683c in g_main_context_dispatch (context=0x633690) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:3641
#20 0x00007ffff3e36a2e in g_main_context_iterate (context=0x633690, block=1, dispatch=1, self=0x635290) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:3712
#21 0x00007ffff3e36e57 in g_main_loop_run (loop=0x633750) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/glib/glib/gmain.c:3906
#22 0x00000000004088ea in main (argc=1, argv=0x7fffffffc338) at /home/prahal/Projects/Devel/Gnome/jhbuild/gnome/gnome-online-accounts/src/daemon/main.c:135
Patch 250758, "move cancelled handler code out to main context":
0001-goaidentity-Fix-deadlock-in-goaalarm-on_cancelled.txt