exo-die: Wrong source memory management
I sometimes (rarely) get this critical warning when closing the modification dialog of a panel launcher:
exo-desktop-ite[24933]: Source ID 485 was not found when attempting to remove it
Backtrace:
Program terminated with signal SIGTRAP, Trace/breakpoint trap.
#0 g_logv (log_domain=0x7f8e18d0e0be "GLib", log_level=G_LOG_LEVEL_CRITICAL, format=<optimized out>, args=<optimized out>) at ../glib/glib/gmessages.c:1422
1422 g_private_set (&g_log_depth, GUINT_TO_POINTER (depth));
[Current thread is 1 (Thread 0x7f8e17492f80 (LWP 24933))]
(gdb) bt
#0 g_logv (log_domain=0x7f8e18d0e0be "GLib", log_level=G_LOG_LEVEL_CRITICAL, format=<optimized out>, args=<optimized out>) at ../glib/glib/gmessages.c:1422
#1 0x00007f8e18cb53e4 in g_log (log_domain=<optimized out>, log_level=<optimized out>, format=<optimized out>) at ../glib/glib/gmessages.c:1460
#2 0x00007f8e18cacae5 in g_source_remove (tag=485) at ../glib/glib/gmain.c:2622
#3 0x000055c3f351a055 in exo_die_desktop_model_finalize (object=0x55c3f460ad70) at exo-die-desktop-model.c:169
#4 0x00007f8e18dbf8b4 in g_object_unref (_object=0x55c3f460ad70) at ../glib/gobject/gobject.c:3938
#5 g_object_unref (_object=0x55c3f460ad70) at ../glib/gobject/gobject.c:3802
#6 0x00007f8e1950cf2d in gtk_tree_model_filter_set_model (child_model=0x0, filter=0x55c3f460b3e0) at ../gtk/gtk/gtktreemodelfilter.c:3655
#7 gtk_tree_model_filter_set_model (filter=0x55c3f460b3e0, child_model=0x0) at ../gtk/gtk/gtktreemodelfilter.c:3631
#8 0x00007f8e19504049 in gtk_tree_model_filter_finalize (object=0x55c3f460b3e0) at ../gtk/gtk/gtktreemodelfilter.c:587
#9 0x00007f8e18dbf8b4 in g_object_unref (_object=0x55c3f460b3e0) at ../glib/gobject/gobject.c:3938
#10 g_object_unref (_object=0x55c3f460b3e0) at ../glib/gobject/gobject.c:3802
#11 0x00007f8e1952ace8 in gtk_tree_view_set_model (model=0x0, tree_view=0x55c3f46d3720) at ../gtk/gtk/gtktreeview.c:11532
#12 gtk_tree_view_set_model (tree_view=0x55c3f46d3720, model=0x0) at ../gtk/gtk/gtktreeview.c:11473
#13 0x00007f8e1951f069 in gtk_tree_view_destroy (widget=0x55c3f46d3720) at ../gtk/gtk/gtktreeview.c:2303
#14 0x00007f8e18db1626 in g_closure_invoke (closure=0x55c3f465e5d0, return_value=0x0, n_param_values=1, param_values=0x7ffc71af3060, invocation_hint=0x7ffc71af2fe0) at ../glib/gobject/gclosure.c:832
#15 0x00007f8e18ddfe05 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x55c3f465e500, detail=detail@entry=0, instance=instance@entry=0x55c3f46d3720, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7ffc71af3060)
at ../glib/gobject/gsignal.c:3930
#16 0x00007f8e18dd0aa7 in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7ffc71af3200) at ../glib/gobject/gsignal.c:3565
#17 0x00007f8e18dd0d34 in g_signal_emit (instance=instance@entry=0x55c3f46d3720, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3622
#18 0x00007f8e1954ed4e in gtk_widget_dispose (object=0x55c3f46d3720) at ../gtk/gtk/gtkwidget.c:12166
#19 0x00007f8e18dbf900 in g_object_run_dispose (object=0x55c3f46d3720) at ../glib/gobject/gobject.c:1448
#20 g_object_run_dispose (object=0x55c3f46d3720) at ../glib/gobject/gobject.c:1441
#21 0x00007f8e193660f0 in gtk_entry_completion_dispose (object=0x55c3f46d1b50) at ../gtk/gtk/gtkentrycompletion.c:792
#22 0x00007f8e18dbf7e3 in g_object_unref (_object=0x55c3f46d1b50) at ../glib/gobject/gobject.c:3891
#23 g_object_unref (_object=0x55c3f46d1b50) at ../glib/gobject/gobject.c:3802
#24 0x00007f8e19365e2f in gtk_entry_set_completion (completion=0x0, entry=0x55c3f47d96b0) at ../gtk/gtk/gtkentry.c:10414
#25 gtk_entry_set_completion (entry=0x55c3f47d96b0, completion=0x0) at ../gtk/gtk/gtkentry.c:10398
#26 0x00007f8e19352573 in gtk_entry_dispose (object=0x55c3f47d96b0) at ../gtk/gtk/gtkentry.c:2992
#27 0x00007f8e18dbf900 in g_object_run_dispose (object=0x55c3f47d96b0) at ../glib/gobject/gobject.c:1448
#28 g_object_run_dispose (object=0x55c3f47d96b0) at ../glib/gobject/gobject.c:1441
#29 0x00007f8e193a6d90 in gtk_grid_forall () at ../gtk/gtk/gtkgrid.c:524
#30 0x00007f8e1930741e in gtk_container_destroy (widget=0x55c3f4716b10) at ../gtk/gtk/gtkcontainer.c:1702
#31 0x00007f8e18db1626 in g_closure_invoke (closure=0x55c3f465e5d0, return_value=0x0, n_param_values=1, param_values=0x7ffc71af35a0, invocation_hint=0x7ffc71af3520) at ../glib/gobject/gclosure.c:832
#32 0x00007f8e18ddfe05 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x55c3f465e500, detail=detail@entry=0, instance=instance@entry=0x55c3f4716b10, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7ffc71af35a0)
at ../glib/gobject/gsignal.c:3930
#33 0x00007f8e18dd0aa7 in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7ffc71af3740) at ../glib/gobject/gsignal.c:3565
#34 0x00007f8e18dd0d34 in g_signal_emit (instance=instance@entry=0x55c3f4716b10, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3622
#35 0x00007f8e1954ed4e in gtk_widget_dispose (object=0x55c3f4716b10) at ../gtk/gtk/gtkwidget.c:12166
#36 0x00007f8e18dbf900 in g_object_run_dispose (object=0x55c3f4716b10) at ../glib/gobject/gobject.c:1448
#37 g_object_run_dispose (object=0x55c3f4716b10) at ../glib/gobject/gobject.c:1441
#38 0x00007f8e192b65b0 in gtk_box_forall (container=<optimized out>, include_internals=<optimized out>, callback=0x7f8e1953f5e0 <gtk_widget_destroy>, callback_data=0x0) at ../gtk/gtk/gtkbox.c:2678
#39 0x00007f8e1930741e in gtk_container_destroy (widget=0x55c3f4710b40) at ../gtk/gtk/gtkcontainer.c:1702
#40 0x00007f8e18db1626 in g_closure_invoke (closure=0x55c3f465e5d0, return_value=0x0, n_param_values=1, param_values=0x7ffc71af3a30, invocation_hint=0x7ffc71af39b0) at ../glib/gobject/gclosure.c:832
#41 0x00007f8e18ddfe05 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x55c3f465e500, detail=detail@entry=0, instance=instance@entry=0x55c3f4710b40, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7ffc71af3a30)
at ../glib/gobject/gsignal.c:3930
#42 0x00007f8e18dd0aa7 in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7ffc71af3bd0) at ../glib/gobject/gsignal.c:3565
#43 0x00007f8e18dd0d34 in g_signal_emit (instance=instance@entry=0x55c3f4710b40, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3622
#44 0x00007f8e1954ed4e in gtk_widget_dispose (object=0x55c3f4710b40) at ../gtk/gtk/gtkwidget.c:12166
#45 0x00007f8e18dbf900 in g_object_run_dispose (object=0x55c3f4710b40) at ../glib/gobject/gobject.c:1448
#46 g_object_run_dispose (object=0x55c3f4710b40) at ../glib/gobject/gobject.c:1441
#47 0x00007f8e192b65b0 in gtk_box_forall (container=<optimized out>, include_internals=<optimized out>, callback=0x7f8e1953f5e0 <gtk_widget_destroy>, callback_data=0x0) at ../gtk/gtk/gtkbox.c:2678
#48 0x00007f8e1930741e in gtk_container_destroy (widget=0x55c3f4713e00) at ../gtk/gtk/gtkcontainer.c:1702
#49 0x00007f8e18db1626 in g_closure_invoke (closure=0x55c3f465e5d0, return_value=0x0, n_param_values=1, param_values=0x7ffc71af3ec0, invocation_hint=0x7ffc71af3e40) at ../glib/gobject/gclosure.c:832
#50 0x00007f8e18ddfe05 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x55c3f465e500, detail=detail@entry=0, instance=instance@entry=0x55c3f4713e00, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7ffc71af3ec0)
at ../glib/gobject/gsignal.c:3930
#51 0x00007f8e18dd0aa7 in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7ffc71af4060) at ../glib/gobject/gsignal.c:3565
#52 0x00007f8e18dd0d34 in g_signal_emit (instance=instance@entry=0x55c3f4713e00, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3622
#53 0x00007f8e1954ed4e in gtk_widget_dispose (object=0x55c3f4713e00) at ../gtk/gtk/gtkwidget.c:12166
#54 0x00007f8e18dbf900 in g_object_run_dispose (object=0x55c3f4713e00) at ../glib/gobject/gobject.c:1448
#55 g_object_run_dispose (object=0x55c3f4713e00) at ../glib/gobject/gobject.c:1441
#56 0x00007f8e1955f1aa in gtk_window_forall (container=0x55c3f47b0130, include_internals=0, callback=0x7f8e1953f5e0 <gtk_widget_destroy>, callback_data=0x0) at ../gtk/gtk/gtkwindow.c:8632
#57 0x00007f8e1930741e in gtk_container_destroy (widget=0x55c3f47b0130) at ../gtk/gtk/gtkcontainer.c:1702
#58 0x00007f8e18db16c0 in g_closure_invoke (closure=0x55c3f465e5d0, return_value=0x0, n_param_values=1, param_values=0x7ffc71af4360, invocation_hint=0x7ffc71af42e0) at ../glib/gobject/gclosure.c:832
#59 0x00007f8e18ddfe05 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x55c3f465e500, detail=detail@entry=0, instance=instance@entry=0x55c3f47b0130, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7ffc71af4360)
at ../glib/gobject/gsignal.c:3930
#60 0x00007f8e18dd0aa7 in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7ffc71af4500) at ../glib/gobject/gsignal.c:3565
#61 0x00007f8e18dd0d34 in g_signal_emit (instance=instance@entry=0x55c3f47b0130, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3622
#62 0x00007f8e1954ed4e in gtk_widget_dispose (object=0x55c3f47b0130) at ../gtk/gtk/gtkwidget.c:12166
#63 0x00007f8e1955a841 in gtk_window_dispose (object=0x55c3f47b0130) at ../gtk/gtk/gtkwindow.c:3191
#64 0x00007f8e18dbf900 in g_object_run_dispose (object=0x55c3f47b0130) at ../glib/gobject/gobject.c:1448
#65 g_object_run_dispose (object=0x55c3f47b0130) at ../glib/gobject/gobject.c:1441
#66 0x00007f8e1953f62a in gtk_widget_destroy (widget=<optimized out>) at ../gtk/gtk/gtkwidget.c:4780
#67 0x000055c3f35175ea in main (argc=<optimized out>, argv=<optimized out>) at main.c:671
I think I've tried looking at it in the past without finding the problem. The source id is correctly reset in the GDestroyNotify, but there must be a race condition that makes it possible to pass in finalize() before...