Deadlock when rapidly undoing file rename
Version information
575c6ced on Arch Linux
Steps to reproduce
mkdir deadlock
touch deadlock/test
thunar deadlock/
- Press F2 and rename
test
totest2
- Hold down Ctrl + z to trigger a deadlock
Backtrace
The mutex is acquired in thunar_job_operation_history_undo
:
Thread 1 "thunar" hit Breakpoint 3, thunar_job_operation_history_undo () at thunar-job-operation-history.c:312
312 g_mutex_lock (&job_operation_history->job_operation_list_mutex);
#0 thunar_job_operation_history_undo () at thunar-job-operation-history.c:312
#1 0x0000555555c6b1c1 in thunar_window_action_undo (window=<optimized out>, menu_item=<optimized out>) at thunar-window.c:3661
#2 0x00007ffff72725de in _gtk_marshal_BOOLEAN__OBJECT_UINT_FLAGS
(n_param_values=<optimized out>, invocation_hint=<optimized out>, closure=0x5070001dcc10, return_value=0x7fffffffd710, param_values=0x7fffffffd7a0, marshal_data=<optimized out>)
at gtk/gtkmarshalers.c:727
#3 _gtk_marshal_BOOLEAN__OBJECT_UINT_FLAGS
(closure=0x5070001dcc10, return_value=0x7fffffffd710, n_param_values=<optimized out>, param_values=0x7fffffffd7a0, invocation_hint=<optimized out>, marshal_data=<optimized out>)
at gtk/gtkmarshalers.c:695
#4 0x00007ffff6e1964a in g_closure_invoke (closure=0x5070001dcc10, return_value=0x7fffffffd710, n_param_values=4, param_values=0x7fffffffd7a0, invocation_hint=0x7fffffffd6f0)
at ../glib/gobject/gclosure.c:834
#5 0x00007ffff6e49ce5 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x7fffffffd8c0, detail=detail@entry=1583, instance=instance@entry=0x5060003747a0, emission_return=emission_return@entry=0x7fffffffd940, instance_and_params=instance_and_params@entry=0x7fffffffd7a0) at ../glib/gobject/gsignal.c:3888
#6 0x00007ffff6e39e40 in signal_emit_valist_unlocked
(instance=instance@entry=0x5060003747a0, signal_id=signal_id@entry=291, detail=detail@entry=1583, var_args=var_args@entry=0x7fffffffda30) at ../glib/gobject/gsignal.c:3533
#7 0x00007ffff6e3a842 in g_signal_emit_valist (instance=0x5060003747a0, signal_id=291, detail=1583, var_args=var_args@entry=0x7fffffffda30) at ../glib/gobject/gsignal.c:3263
#8 0x00007ffff6e3a904 in g_signal_emit (instance=instance@entry=0x5060003747a0, signal_id=<optimized out>, detail=detail@entry=1583) at ../glib/gobject/gsignal.c:3583
#9 0x00007ffff728348c in gtk_accel_group_activate
(accel_group=0x5060003747a0, accel_quark=accel_quark@entry=1583, acceleratable=acceleratable@entry=0x51a0000176e0, accel_key=accel_key@entry=122, accel_mods=accel_mods@entry=GDK_CONTROL_MASK) at ../gtk/gtk/gtkaccelgroup.c:910
#10 0x00007ffff72848de in gtk_accel_groups_activate (object=0x51a0000176e0, accel_key=122, accel_mods=GDK_CONTROL_MASK) at ../gtk/gtk/gtkaccelgroup.c:948
#11 0x00007ffff7569da4 in gtk_window_activate_key (window=window@entry=0x51a0000176e0, event=event@entry=0x50e000147440) at ../gtk/gtk/gtkwindow.c:12097
#12 0x00007ffff756a217 in gtk_window_key_press_event (widget=0x51a0000176e0, event=0x50e000147440) at ../gtk/gtk/gtkwindow.c:8288
#13 0x00007ffff72787d5 in _gtk_marshal_BOOLEAN__BOXED
(closure=0x50600003b740, return_value=0x7fffffffddf0, param_values=0x7fffffffde80, marshal_data=<optimized out>, invocation_hint=<optimized out>, n_param_values=<optimized out>)
at gtk/gtkmarshalers.c:84
#14 0x00007ffff6e1964a in g_closure_invoke (closure=0x50600003b740, return_value=0x7fffffffddf0, n_param_values=2, param_values=0x7fffffffde80, invocation_hint=0x7fffffffddd0)
at ../glib/gobject/gclosure.c:834
#15 0x00007ffff6e4a2d2 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x7fffffffdf70, detail=detail@entry=0, instance=instance@entry=0x51a0000176e0, emission_return=emission_return@entry=0x7fffffffdff0, instance_and_params=instance_and_params@entry=0x7fffffffde80) at ../glib/gobject/gsignal.c:3928
#16 0x00007ffff6e39e40 in signal_emit_valist_unlocked (instance=instance@entry=0x51a0000176e0, signal_id=signal_id@entry=134, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffe0e0)
at ../glib/gobject/gsignal.c:3533
#17 0x00007ffff6e3a842 in g_signal_emit_valist (instance=0x51a0000176e0, signal_id=134, detail=0, var_args=var_args@entry=0x7fffffffe0e0) at ../glib/gobject/gsignal.c:3263
#18 0x00007ffff6e3a904 in g_signal_emit (instance=instance@entry=0x51a0000176e0, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3583
#19 0x00007ffff7557d15 in gtk_widget_event_internal.part.0.lto_priv.0 (widget=0x51a0000176e0, event=0x50e000147440) at ../gtk/gtk/gtkwidget.c:7812
#20 0x00007ffff73e558a in propagate_event (widget=widget@entry=0x51a0000176e0, event=event@entry=0x50e000147440, captured=captured@entry=0, topmost=topmost@entry=0x0)
at ../gtk/gtk/gtkmain.c:2681
#21 0x00007ffff73e5601 in gtk_propagate_event (widget=0x51a0000176e0, event=0x50e000147440) at ../gtk/gtk/gtkmain.c:2725
#22 0x00007ffff73e6273 in gtk_main_do_event (event=<optimized out>) at ../gtk/gtk/gtkmain.c:1921
#23 gtk_main_do_event (event=<optimized out>) at ../gtk/gtk/gtkmain.c:1691
#24 0x00007ffff7bbe3c7 in _gdk_event_emit (event=0x50e000147440) at ../gtk/gdk/gdkevents.c:73
#25 _gdk_event_emit (event=0x50e000147440) at ../gtk/gdk/gdkevents.c:67
#26 0x00007ffff7c1a200 in gdk_event_source_dispatch.lto_priv () at ../gtk/gdk/x11/gdkeventsource.c:354
#27 0x00007ffff6ec3ab9 in g_main_dispatch (context=0x510000000440) at ../glib/glib/gmain.c:3344
#28 0x00007ffff6f259e7 in g_main_context_dispatch_unlocked (context=0x510000000440) at ../glib/glib/gmain.c:4152
#29 g_main_context_iterate_unlocked.isra.0 (context=context@entry=0x510000000440, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/glib/gmain.c:4217
#30 0x00007ffff6ec2fc5 in g_main_context_iteration (context=context@entry=0x510000000440, may_block=may_block@entry=1) at ../glib/glib/gmain.c:4282
#31 0x00007ffff7092c66 in g_application_run (application=application@entry=0x514000000f40, argc=argc@entry=2, argv=argv@entry=0x7fffffffe6f8) at ../glib/gio/gapplication.c:2712
#32 0x0000555555a18a18 in main (argc=<optimized out>, argv=<optimized out>) at main.c:86
While the mutex is held, thunar_job_operation_history_undo
runs a dialog that handles the undo shortcut and re-enters thunar_job_operation_history_undo
where it gets stuck waiting for the previously acquired mutex:
Thread 1 "thunar" hit Breakpoint 3, thunar_job_operation_history_undo () at thunar-job-operation-history.c:312
312 g_mutex_lock (&job_operation_history->job_operation_list_mutex);
#0 thunar_job_operation_history_undo () at thunar-job-operation-history.c:312
#1 0x0000555555c6b1c1 in thunar_window_action_undo (window=<optimized out>, menu_item=<optimized out>) at thunar-window.c:3661
#2 0x00007ffff72725de in _gtk_marshal_BOOLEAN__OBJECT_UINT_FLAGS
(n_param_values=<optimized out>, invocation_hint=<optimized out>, closure=0x5070001dcc10, return_value=0x7fffffffc440, param_values=0x7fffffffc4d0, marshal_data=<optimized out>)
at gtk/gtkmarshalers.c:727
#3 _gtk_marshal_BOOLEAN__OBJECT_UINT_FLAGS
(closure=0x5070001dcc10, return_value=0x7fffffffc440, n_param_values=<optimized out>, param_values=0x7fffffffc4d0, invocation_hint=<optimized out>, marshal_data=<optimized out>)
at gtk/gtkmarshalers.c:695
#4 0x00007ffff6e195ad in g_closure_invoke (closure=0x5070001dcc10, return_value=0x7fffffffc440, n_param_values=4, param_values=0x7fffffffc4d0, invocation_hint=0x7fffffffc420)
at ../glib/gobject/gclosure.c:834
#5 0x00007ffff6e49ce5 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x7fffffffc5f0, detail=detail@entry=1583, instance=instance@entry=0x5060003747a0, emission_return=emission_return@entry=0x7fffffffc670, instance_and_params=instance_and_params@entry=0x7fffffffc4d0) at ../glib/gobject/gsignal.c:3888
#6 0x00007ffff6e39e40 in signal_emit_valist_unlocked
(instance=instance@entry=0x5060003747a0, signal_id=signal_id@entry=291, detail=detail@entry=1583, var_args=var_args@entry=0x7fffffffc760) at ../glib/gobject/gsignal.c:3533
#7 0x00007ffff6e3a842 in g_signal_emit_valist (instance=0x5060003747a0, signal_id=291, detail=1583, var_args=var_args@entry=0x7fffffffc760) at ../glib/gobject/gsignal.c:3263
#8 0x00007ffff6e3a904 in g_signal_emit (instance=instance@entry=0x5060003747a0, signal_id=<optimized out>, detail=detail@entry=1583) at ../glib/gobject/gsignal.c:3583
#9 0x00007ffff728348c in gtk_accel_group_activate
(accel_group=0x5060003747a0, accel_quark=accel_quark@entry=1583, acceleratable=acceleratable@entry=0x51a0000176e0, accel_key=accel_key@entry=122, accel_mods=accel_mods@entry=GDK_CONTROL_MASK) at ../gtk/gtk/gtkaccelgroup.c:910
#10 0x00007ffff72848de in gtk_accel_groups_activate (object=0x51a0000176e0, accel_key=122, accel_mods=GDK_CONTROL_MASK) at ../gtk/gtk/gtkaccelgroup.c:948
#11 0x00007ffff7569da4 in gtk_window_activate_key (window=window@entry=0x51a0000176e0, event=event@entry=0x50e000148be0) at ../gtk/gtk/gtkwindow.c:12097
#12 0x00007ffff756a217 in gtk_window_key_press_event (widget=0x51a0000176e0, event=0x50e000148be0) at ../gtk/gtk/gtkwindow.c:8288
#13 0x00007ffff72787d5 in _gtk_marshal_BOOLEAN__BOXED
(closure=0x50600003b740, return_value=0x7fffffffcb20, param_values=0x7fffffffcbb0, marshal_data=<optimized out>, invocation_hint=<optimized out>, n_param_values=<optimized out>)
at gtk/gtkmarshalers.c:84
#14 0x00007ffff6e195ad in g_closure_invoke (closure=0x50600003b740, return_value=0x7fffffffcb20, n_param_values=2, param_values=0x7fffffffcbb0, invocation_hint=0x7fffffffcb00)
at ../glib/gobject/gclosure.c:834
#15 0x00007ffff6e4a2d2 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x7fffffffcca0, detail=detail@entry=0, instance=instance@entry=0x51a0000176e0, emission_return=emission_return@entry=0x7fffffffcd20, instance_and_params=instance_and_params@entry=0x7fffffffcbb0) at ../glib/gobject/gsignal.c:3928
#16 0x00007ffff6e39e40 in signal_emit_valist_unlocked (instance=instance@entry=0x51a0000176e0, signal_id=signal_id@entry=134, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffce10)
at ../glib/gobject/gsignal.c:3533
#17 0x00007ffff6e3a842 in g_signal_emit_valist (instance=0x51a0000176e0, signal_id=134, detail=0, var_args=var_args@entry=0x7fffffffce10) at ../glib/gobject/gsignal.c:3263
#18 0x00007ffff6e3a904 in g_signal_emit (instance=instance@entry=0x51a0000176e0, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3583
#19 0x00007ffff7557d15 in gtk_widget_event_internal.part.0.lto_priv.0 (widget=0x51a0000176e0, event=0x50e000148be0) at ../gtk/gtk/gtkwidget.c:7812
#20 0x00007ffff73e558a in propagate_event (widget=widget@entry=0x51a0000176e0, event=event@entry=0x50e000148be0, captured=captured@entry=0, topmost=topmost@entry=0x0)
at ../gtk/gtk/gtkmain.c:2681
#21 0x00007ffff73e5601 in gtk_propagate_event (widget=0x51a0000176e0, event=0x50e000148be0) at ../gtk/gtk/gtkmain.c:2725
#22 0x00007ffff73e6273 in gtk_main_do_event (event=<optimized out>) at ../gtk/gtk/gtkmain.c:1921
#23 gtk_main_do_event (event=<optimized out>) at ../gtk/gtk/gtkmain.c:1691
#24 0x00007ffff7bbe3c7 in _gdk_event_emit (event=0x50e000148be0) at ../gtk/gdk/gdkevents.c:73
#25 _gdk_event_emit (event=0x50e000148be0) at ../gtk/gdk/gdkevents.c:67
#26 0x00007ffff7c1a200 in gdk_event_source_dispatch.lto_priv () at ../gtk/gdk/x11/gdkeventsource.c:354
#27 0x00007ffff6ec3ab9 in g_main_dispatch (context=0x510000000440) at ../glib/glib/gmain.c:3344
#28 0x00007ffff6f259e7 in g_main_context_dispatch_unlocked (context=0x510000000440) at ../glib/glib/gmain.c:4152
#29 g_main_context_iterate_unlocked.isra.0 (context=0x510000000440, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/glib/gmain.c:4217
#30 0x00007ffff6ec47b7 in g_main_loop_run (loop=0x502000658c90) at ../glib/glib/gmain.c:4419
#31 0x00007ffff733c5e0 in gtk_dialog_run (dialog=dialog@entry=0x518000031b40) at ../gtk/gtk/gtkdialog.c:1399
#32 0x00007ffff79e6fa7 in IA__xfce_message_dialog
(parent=parent@entry=0x0, title=title@entry=0x0, stock_id=stock_id@entry=0x7ffff79ed72d "dialog-warning", primary_text=primary_text@entry=0x503000ab13f0 "There is no operation to undo", secondary_text=secondary_text@entry=0x55555581e740 <str> "No operation which can be undone has been performed yet.\n(For some operations undo is not supported)", first_button_text=first_button_text@entry=0x7ffff79ed6c2 "button-mixed") at /usr/src/debug/libxfce4ui/libxfce4ui-4.18.6/libxfce4ui/xfce-dialogs.c:877
#33 0x00007ffff79e7294 in IA__xfce_dialog_show_warning
(parent=parent@entry=0x0, secondary_text=secondary_text@entry=0x55555581e740 <str> "No operation which can be undone has been performed yet.\n(For some operations undo is not supported)", primary_format=<optimized out>) at /usr/src/debug/libxfce4ui/libxfce4ui-4.18.6/libxfce4ui/xfce-dialogs.c:367
#34 0x0000555555b021e3 in thunar_job_operation_history_undo () at thunar-job-operation-history.c:317
#35 0x0000555555c6b1c1 in thunar_window_action_undo (window=<optimized out>, menu_item=<optimized out>) at thunar-window.c:3661
#36 0x00007ffff72725de in _gtk_marshal_BOOLEAN__OBJECT_UINT_FLAGS
(n_param_values=<optimized out>, invocation_hint=<optimized out>, closure=0x5070001dcc10, return_value=0x7fffffffd710, param_values=0x7fffffffd7a0, marshal_data=<optimized out>)
at gtk/gtkmarshalers.c:727
#37 _gtk_marshal_BOOLEAN__OBJECT_UINT_FLAGS
(closure=0x5070001dcc10, return_value=0x7fffffffd710, n_param_values=<optimized out>, param_values=0x7fffffffd7a0, invocation_hint=<optimized out>, marshal_data=<optimized out>)
at gtk/gtkmarshalers.c:695
#38 0x00007ffff6e1964a in g_closure_invoke (closure=0x5070001dcc10, return_value=0x7fffffffd710, n_param_values=4, param_values=0x7fffffffd7a0, invocation_hint=0x7fffffffd6f0)
at ../glib/gobject/gclosure.c:834
#39 0x00007ffff6e49ce5 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x7fffffffd8c0, detail=detail@entry=1583, instance=instance@entry=0x5060003747a0, emission_return=emission_return@entry=0x7fffffffd940, instance_and_params=instance_and_params@entry=0x7fffffffd7a0) at ../glib/gobject/gsignal.c:3888
#40 0x00007ffff6e39e40 in signal_emit_valist_unlocked
(instance=instance@entry=0x5060003747a0, signal_id=signal_id@entry=291, detail=detail@entry=1583, var_args=var_args@entry=0x7fffffffda30) at ../glib/gobject/gsignal.c:3533
#41 0x00007ffff6e3a842 in g_signal_emit_valist (instance=0x5060003747a0, signal_id=291, detail=1583, var_args=var_args@entry=0x7fffffffda30) at ../glib/gobject/gsignal.c:3263
#42 0x00007ffff6e3a904 in g_signal_emit (instance=instance@entry=0x5060003747a0, signal_id=<optimized out>, detail=detail@entry=1583) at ../glib/gobject/gsignal.c:3583
#43 0x00007ffff728348c in gtk_accel_group_activate
(accel_group=0x5060003747a0, accel_quark=accel_quark@entry=1583, acceleratable=acceleratable@entry=0x51a0000176e0, accel_key=accel_key@entry=122, accel_mods=accel_mods@entry=GDK_CONTROL_MASK) at ../gtk/gtk/gtkaccelgroup.c:910
#44 0x00007ffff72848de in gtk_accel_groups_activate (object=0x51a0000176e0, accel_key=122, accel_mods=GDK_CONTROL_MASK) at ../gtk/gtk/gtkaccelgroup.c:948
#45 0x00007ffff7569da4 in gtk_window_activate_key (window=window@entry=0x51a0000176e0, event=event@entry=0x50e000147440) at ../gtk/gtk/gtkwindow.c:12097
#46 0x00007ffff756a217 in gtk_window_key_press_event (widget=0x51a0000176e0, event=0x50e000147440) at ../gtk/gtk/gtkwindow.c:8288
#47 0x00007ffff72787d5 in _gtk_marshal_BOOLEAN__BOXED
(closure=0x50600003b740, return_value=0x7fffffffddf0, param_values=0x7fffffffde80, marshal_data=<optimized out>, invocation_hint=<optimized out>, n_param_values=<optimized out>)
at gtk/gtkmarshalers.c:84
#48 0x00007ffff6e1964a in g_closure_invoke (closure=0x50600003b740, return_value=0x7fffffffddf0, n_param_values=2, param_values=0x7fffffffde80, invocation_hint=0x7fffffffddd0)
at ../glib/gobject/gclosure.c:834
#49 0x00007ffff6e4a2d2 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x7fffffffdf70, detail=detail@entry=0, instance=instance@entry=0x51a0000176e0, emission_return=emission_return@entry=0x7fffffffdff0, instance_and_params=instance_and_params@entry=0x7fffffffde80) at ../glib/gobject/gsignal.c:3928
#50 0x00007ffff6e39e40 in signal_emit_valist_unlocked (instance=instance@entry=0x51a0000176e0, signal_id=signal_id@entry=134, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffe0e0)
at ../glib/gobject/gsignal.c:3533
#51 0x00007ffff6e3a842 in g_signal_emit_valist (instance=0x51a0000176e0, signal_id=134, detail=0, var_args=var_args@entry=0x7fffffffe0e0) at ../glib/gobject/gsignal.c:3263
#52 0x00007ffff6e3a904 in g_signal_emit (instance=instance@entry=0x51a0000176e0, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3583
#53 0x00007ffff7557d15 in gtk_widget_event_internal.part.0.lto_priv.0 (widget=0x51a0000176e0, event=0x50e000147440) at ../gtk/gtk/gtkwidget.c:7812
#54 0x00007ffff73e558a in propagate_event (widget=widget@entry=0x51a0000176e0, event=event@entry=0x50e000147440, captured=captured@entry=0, topmost=topmost@entry=0x0)
at ../gtk/gtk/gtkmain.c:2681
#55 0x00007ffff73e5601 in gtk_propagate_event (widget=0x51a0000176e0, event=0x50e000147440) at ../gtk/gtk/gtkmain.c:2725
#56 0x00007ffff73e6273 in gtk_main_do_event (event=<optimized out>) at ../gtk/gtk/gtkmain.c:1921
#57 gtk_main_do_event (event=<optimized out>) at ../gtk/gtk/gtkmain.c:1691
#58 0x00007ffff7bbe3c7 in _gdk_event_emit (event=0x50e000147440) at ../gtk/gdk/gdkevents.c:73
#59 _gdk_event_emit (event=0x50e000147440) at ../gtk/gdk/gdkevents.c:67
#60 0x00007ffff7c1a200 in gdk_event_source_dispatch.lto_priv () at ../gtk/gdk/x11/gdkeventsource.c:354
#61 0x00007ffff6ec3ab9 in g_main_dispatch (context=0x510000000440) at ../glib/glib/gmain.c:3344
#62 0x00007ffff6f259e7 in g_main_context_dispatch_unlocked (context=0x510000000440) at ../glib/glib/gmain.c:4152
#63 g_main_context_iterate_unlocked.isra.0 (context=context@entry=0x510000000440, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/glib/gmain.c:4217
#64 0x00007ffff6ec2fc5 in g_main_context_iteration (context=context@entry=0x510000000440, may_block=may_block@entry=1) at ../glib/glib/gmain.c:4282
#65 0x00007ffff7092c66 in g_application_run (application=application@entry=0x514000000f40, argc=argc@entry=2, argv=argv@entry=0x7fffffffe6f8) at ../glib/gio/gapplication.c:2712
#66 0x0000555555a18a18 in main (argc=<optimized out>, argv=<optimized out>) at main.c:86