Finalization speedup (commit fa8c7c0d) causes crash in gtk3 demo
The Menus demo in gtk3 and gtkmm3 crashes when a GtkAccelGroup is finalized. To see the crash in gtk3, you must add g_object_unref(accel_group), otherwise the GtkAccelGroup is never finalized. In gtk+-3/demos/gtk-demo/menus.c:
accel_group = gtk_accel_group_new ();
gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
g_object_unref (accel_group); /* Add */
Backtrace:
Thread 1 "gtk3-demo" received signal SIGSEGV, Segmentation fault.
object_remove_closure (data=0x555555794a40, closure=0x555555cc1b70) at ../../gnome/glib/gobject/gobject.c:4592
4592 for (i = 0; i < carray->n_closures; i++)
(gdb) bt
#0 object_remove_closure (data=0x555555794a40, closure=0x555555cc1b70)
at ../../gnome/glib/gobject/gobject.c:4592
#1 0x00007ffff74d3b17 in closure_invoke_notifiers (notify_type=<optimized out>,
closure=<optimized out>) at ../../gnome/glib/gobject/gclosure.c:280
#2 closure_invoke_notifiers (notify_type=<optimized out>, closure=<optimized out>)
at ../../gnome/glib/gobject/gclosure.c:232
#3 g_closure_invalidate (closure=0x555555cc1b70) at ../../gnome/glib/gobject/gclosure.c:598
#4 g_closure_invalidate (closure=0x555555cc1b70) at ../../gnome/glib/gobject/gclosure.c:587
#5 0x00007ffff74d39e8 in g_closure_unref (closure=0x555555cc1b70)
at ../../gnome/glib/gobject/gclosure.c:622
#6 0x00007ffff74ed578 in handler_unref_R (handler=<optimized out>, instance=0x0, signal_id=0)
at ../../gnome/glib/gobject/gsignal.c:769
#7 handler_unref_R (handler=<optimized out>, instance=0x0, signal_id=0)
at ../../gnome/glib/gobject/gsignal.c:718
#8 g_signal_handlers_destroy (instance=<optimized out>) at ../../gnome/glib/gobject/gsignal.c:2804
#9 0x00007ffff74d8f7d in g_object_real_dispose (object=0x555555ae3a20)
at ../../gnome/glib/gobject/gobject.c:1327
#10 0x00007ffff74d9761 in g_object_unref (_object=<optimized out>)
at ../../gnome/glib/gobject/gobject.c:3795
#11 g_object_unref (_object=0x555555ae3a20) at ../../gnome/glib/gobject/gobject.c:3712
#12 0x00007ffff782ab31 in accel_group_weak_ref_detach (free_list=0x555555944080,
stale_object=0x555555794a40) at ../../gnome/gtk+-3/gtk/gtkaccelgroup.c:300
#13 0x00007ffff74d8507 in weak_refs_notify (data=0x5555559951a0)
--Type <RET> for more, q to quit, c to continue without paging--
at ../../gnome/glib/gobject/gobject.c:3196
#14 0x00007ffff75555ee in g_data_remove_internal (datalist=0x555555794a50, keys=0x7fffffffc36c,
n_keys=<optimized out>) at ../../gnome/glib/glib/gdataset.c:560
#15 0x00007ffff7555c2d in g_datalist_id_remove_multiple (datalist=datalist@entry=0x555555794a50,
keys=keys@entry=0x7fffffffc36c, n_keys=n_keys@entry=3) at ../../gnome/glib/glib/gdataset.c:775
#16 0x00007ffff74d8f90 in g_object_real_dispose (object=0x555555794a40)
at ../../gnome/glib/gobject/gobject.c:1328
#17 0x00007ffff7b19750 in gtk_window_dispose (object=0x555555794a40)
at ../../gnome/gtk+-3/gtk/gtkwindow.c:3167
#18 0x00007ffff74db111 in g_object_run_dispose (object=0x555555794a40)
at ../../gnome/glib/gobject/gobject.c:1411
#19 0x00007ffff74d42c9 in _g_closure_invoke_va (closure=closure@entry=0x555556224700,
return_value=return_value@entry=0x0, instance=instance@entry=0x55555595cdc0,
args=args@entry=0x7fffffffc5c0, n_params=0, param_types=0x0)
at ../../gnome/glib/gobject/gclosure.c:893
#20 0x00007ffff74ef3f4 in g_signal_emit_valist (instance=0x55555595cdc0, signal_id=236,
detail=<optimized out>, var_args=var_args@entry=0x7fffffffc5c0)
at ../../gnome/glib/gobject/gsignal.c:3406
#21 0x00007ffff74ef623 in g_signal_emit (instance=instance@entry=0x55555595cdc0,
signal_id=<optimized out>, detail=detail@entry=0) at ../../gnome/glib/gobject/gsignal.c:3553
#22 0x00007ffff785dc62 in gtk_button_clicked (button=button@entry=0x55555595cdc0)
at ../../gnome/gtk+-3/gtk/gtkbutton.c:1541
#23 0x00007ffff785dda0 in gtk_button_do_release (emit_clicked=1, button=0x55555595cdc0)
--Type <RET> for more, q to quit, c to continue without paging--
at ../../gnome/gtk+-3/gtk/gtkbutton.c:1845
#24 gtk_button_do_release (emit_clicked=1, button=0x55555595cdc0)
at ../../gnome/gtk+-3/gtk/gtkbutton.c:1832
#25 gtk_real_button_released (button=0x55555595cdc0) at ../../gnome/gtk+-3/gtk/gtkbutton.c:1963
#26 0x00007ffff74d42c9 in _g_closure_invoke_va (closure=closure@entry=0x5555558b8920,
return_value=return_value@entry=0x0, instance=instance@entry=0x55555595cdc0,
args=args@entry=0x7fffffffc8e0, n_params=0, param_types=0x0)
at ../../gnome/glib/gobject/gclosure.c:893
#27 0x00007ffff74ef3f4 in g_signal_emit_valist (instance=0x55555595cdc0, signal_id=235,
detail=<optimized out>, var_args=var_args@entry=0x7fffffffc8e0)
at ../../gnome/glib/gobject/gsignal.c:3406
#28 0x00007ffff74ef623 in g_signal_emit (instance=instance@entry=0x55555595cdc0,
signal_id=<optimized out>, detail=detail@entry=0) at ../../gnome/glib/gobject/gsignal.c:3553
#29 0x00007ffff785ce97 in multipress_released_cb (gesture=0x555555b49e90, n_press=<optimized out>,
x=<optimized out>, y=<optimized out>, widget=<optimized out>)
at ../../gnome/gtk+-3/gtk/gtkbutton.c:666
#30 0x00007ffff78157b5 in _gtk_marshal_VOID__INT_DOUBLE_DOUBLEv (
closure=closure@entry=0x555556224390, return_value=return_value@entry=0x0,
instance=instance@entry=0x555555b49e90, args=args@entry=0x7fffffffcc00,
marshal_data=marshal_data@entry=0x0, n_params=n_params@entry=3, param_types=0x5555558d39e0)
at gtk/gtkmarshalers.c:4804
#31 0x00007ffff74d42c9 in _g_closure_invoke_va (closure=closure@entry=0x555556224390,
return_value=return_value@entry=0x0, instance=instance@entry=0x555555b49e90,
--Type <RET> for more, q to quit, c to continue without paging--
args=args@entry=0x7fffffffcc00, n_params=3, param_types=0x5555558d39e0)
at ../../gnome/glib/gobject/gclosure.c:893
#32 0x00007ffff74ef3f4 in g_signal_emit_valist (instance=0x555555b49e90, signal_id=224,
detail=<optimized out>, var_args=var_args@entry=0x7fffffffcc00)
at ../../gnome/glib/gobject/gsignal.c:3406
#33 0x00007ffff74ef623 in g_signal_emit (instance=instance@entry=0x555555b49e90,
signal_id=<optimized out>, detail=detail@entry=0) at ../../gnome/glib/gobject/gsignal.c:3553
#34 0x00007ffff793f0e4 in gtk_gesture_multi_press_end (gesture=0x555555b49e90,
sequence=sequence@entry=0x0) at ../../gnome/gtk+-3/gtk/gtkgesturemultipress.c:287
#35 0x00007ffff74d7576 in g_cclosure_marshal_VOID__BOXEDv (closure=0x5555558ae7b0,
return_value=<optimized out>, instance=0x555555b49e90, args=<optimized out>,
marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x5555558b6420)
at ../../gnome/glib/gobject/gmarshal.c:1686
#36 0x00007ffff74d42c9 in _g_closure_invoke_va (closure=closure@entry=0x5555558ae7b0,
return_value=return_value@entry=0x0, instance=instance@entry=0x555555b49e90,
args=args@entry=0x7fffffffcf80, n_params=1, param_types=0x5555558b6420)
at ../../gnome/glib/gobject/gclosure.c:893
#37 0x00007ffff74ef3f4 in g_signal_emit_valist (instance=0x555555b49e90, signal_id=219,
detail=<optimized out>, var_args=var_args@entry=0x7fffffffcf80)
at ../../gnome/glib/gobject/gsignal.c:3406
#38 0x00007ffff74ef623 in g_signal_emit (instance=instance@entry=0x555555b49e90,
signal_id=<optimized out>, detail=detail@entry=0) at ../../gnome/glib/gobject/gsignal.c:3553
#39 0x00007ffff793b9b7 in _gtk_gesture_set_recognized (sequence=0x0, recognized=0,
--Type <RET> for more, q to quit, c to continue without paging--
gesture=0x555555b49e90) at ../../gnome/gtk+-3/gtk/gtkgesture.c:346
#40 _gtk_gesture_check_recognized (gesture=gesture@entry=0x555555b49e90,
sequence=sequence@entry=0x0) at ../../gnome/gtk+-3/gtk/gtkgesture.c:387
#41 0x00007ffff793d1c3 in gtk_gesture_handle_event (controller=<optimized out>,
event=0x555555b4e0c0) at ../../gnome/gtk+-3/gtk/gtkgesture.c:784
#42 0x00007ffff7940918 in gtk_gesture_single_handle_event (controller=0x555555b49e90,
event=0x555555b4e0c0) at ../../gnome/gtk+-3/gtk/gtkgesturesingle.c:222
#43 0x00007ffff78ff640 in gtk_event_controller_handle_event (controller=0x555555b49e90,
event=event@entry=0x555555b4e0c0) at ../../gnome/gtk+-3/gtk/gtkeventcontroller.c:230
#44 0x00007ffff7af783d in _gtk_widget_run_controllers (widget=0x55555595cdc0,
event=0x555555b4e0c0, phase=GTK_PHASE_BUBBLE) at ../../gnome/gtk+-3/gtk/gtkwidget.c:7447
#45 0x00007ffff780ec28 in _gtk_marshal_BOOLEAN__BOXEDv (closure=0x5555557dd8c0,
return_value=0x7fffffffd310, instance=<optimized out>, args=<optimized out>,
marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x5555557e2c80)
at gtk/gtkmarshalers.c:130
#46 0x00007ffff74d42c9 in _g_closure_invoke_va (closure=closure@entry=0x5555557dd8c0,
return_value=return_value@entry=0x7fffffffd310, instance=instance@entry=0x55555595cdc0,
args=args@entry=0x7fffffffd3e0, n_params=1, param_types=0x5555557e2c80)
at ../../gnome/glib/gobject/gclosure.c:893
#47 0x00007ffff74ee7b1 in g_signal_emit_valist (instance=0x55555595cdc0, signal_id=96,
detail=<optimized out>, var_args=var_args@entry=0x7fffffffd3e0)
at ../../gnome/glib/gobject/gsignal.c:3406
#48 0x00007ffff74ef623 in g_signal_emit (instance=instance@entry=0x55555595cdc0,
--Type <RET> for more, q to quit, c to continue without paging--
signal_id=<optimized out>, detail=detail@entry=0) at ../../gnome/glib/gobject/gsignal.c:3553
#49 0x00007ffff7af93e4 in gtk_widget_event_internal (widget=widget@entry=0x55555595cdc0,
event=event@entry=0x555555b4e0c0) at ../../gnome/gtk+-3/gtk/gtkwidget.c:7812
#50 0x00007ffff7afc1e2 in gtk_widget_event_internal (event=0x555555b4e0c0, widget=0x55555595cdc0)
at ../../gnome/gtk+-3/gtk/gtkwidget.c:7383
#51 0x00007ffff798e870 in propagate_event_up (topmost=<optimized out>, event=<optimized out>,
widget=0x55555595cdc0) at ../../gnome/gtk+-3/gtk/gtkmain.c:2588
#52 propagate_event (widget=widget@entry=0x55555595cdc0, event=event@entry=0x555555b4e0c0,
captured=captured@entry=0, topmost=topmost@entry=0x0) at ../../gnome/gtk+-3/gtk/gtkmain.c:2691
#53 0x00007ffff798fc23 in gtk_propagate_event (widget=widget@entry=0x55555595cdc0,
event=event@entry=0x555555b4e0c0) at ../../gnome/gtk+-3/gtk/gtkmain.c:2725
#54 0x00007ffff79903d5 in gtk_main_do_event (event=0x555555b4e0c0)
at ../../gnome/gtk+-3/gtk/gtkmain.c:1921
#55 gtk_main_do_event (event=<optimized out>) at ../../gnome/gtk+-3/gtk/gtkmain.c:1691
#56 0x00007ffff769a5b9 in _gdk_event_emit (event=event@entry=0x555555b4e0c0)
at ../../gnome/gtk+-3/gdk/gdkevents.c:73
#57 0x00007ffff76d1786 in gdk_event_source_dispatch (base=<optimized out>,
callback=<optimized out>, data=<optimized out>)
at ../../gnome/gtk+-3/gdk/wayland/gdkeventsource.c:124
#58 0x00007ffff7576dbb in g_main_dispatch (context=0x55555574aff0)
at ../../gnome/glib/glib/gmain.c:3427
#59 g_main_context_dispatch (context=0x55555574aff0) at ../../gnome/glib/glib/gmain.c:4145
#60 0x00007ffff7577068 in g_main_context_iterate (context=context@entry=0x55555574aff0,
--Type <RET> for more, q to quit, c to continue without paging--
block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>)
at ../../gnome/glib/glib/gmain.c:4221
#61 0x00007ffff7577133 in g_main_context_iteration (context=context@entry=0x55555574aff0,
may_block=may_block@entry=1) at ../../gnome/glib/glib/gmain.c:4286
#62 0x00007ffff73b4e35 in g_application_run (application=0x5555557450f0, argc=argc@entry=1,
argv=argv@entry=0x7fffffffd898) at ../../gnome/glib/gio/gapplication.c:2571
#63 0x0000555555579f09 in main (argc=1, argv=0x7fffffffd898)
at ../../gnome/gtk+-3/demos/gtk-demo/main.c:1208
If commit fa8c7c0d is reverted, the Menus demo can be closed without crashing.