ListStore clear randomly takes several seconds
When using ListStore a model of TreeView, sometimes when I add a lot of elements, then clearing model takes several seconds.
Usually clearing liststore with 50000 elements with a few columns takes ~200ms
20:08:49.675 [DEBUG] czkawka_gui::connect_things::connect_button_search: Start clean tree view
20:08:49.871 [DEBUG] czkawka_gui::connect_things::connect_button_search: Cleared tree view
but sometimes it takes a lot of more time - recently 15 seconds
20:00:58.594 [DEBUG] czkawka_gui::connect_things::connect_button_search: Start clean tree view
20:01:13.206 [DEBUG] czkawka_gui::connect_things::connect_button_search: Cleared tree view
I use this in gtk4-rs and I just clear liststore via
let list_store = get_list_store(tree_view);
list_store.clear();
which internally is just simple ffi call
#[doc(alias = "gtk_list_store_clear")]
pub fn clear(&self) {
unsafe {
ffi::gtk_list_store_clear(self.to_glib_none().0);
}
}
This happens now with 4.10.4, but also happened with Gtk 3.24
Backtrace of place where it freeze for a while(I tried two times and each time it freeze inside this function)
0x00007ffff796ae42 in unselect_all_helper (tree=0x555556edab20, node=0x55555a2f2cb0, data=0x555558c10d40) at ../../../gtk/deprecated/gtktreeselection.c:1166
#0 0x00007ffff796ae42 in unselect_all_helper (tree=0x555556edab20, node=0x55555a2f2cb0, data=0x555558c10d40) at ../../../gtk/deprecated/gtktreeselection.c:1166
#1 0x00007ffff796588d in gtk_tree_rbtree_traverse_pre_order (data=0x555558c10d40, func=0x7ffff796ae30 <unselect_all_helper>, node=<optimized out>, tree=0x555556edab20) at ../../../gtk/deprecated/gtktreerbtree.c:1433
#2 gtk_tree_rbtree_traverse_pre_order (data=0x555558c10d40, func=0x7ffff796ae30 <unselect_all_helper>, node=<optimized out>, tree=0x555556edab20) at ../../../gtk/deprecated/gtktreerbtree.c:1434
#3 gtk_tree_rbtree_traverse_pre_order (data=0x555558c10d40, func=0x7ffff796ae30 <unselect_all_helper>, node=<optimized out>, tree=0x555556edab20) at ../../../gtk/deprecated/gtktreerbtree.c:1434
#4 gtk_tree_rbtree_traverse_pre_order (data=0x555558c10d40, func=0x7ffff796ae30 <unselect_all_helper>, node=<optimized out>, tree=0x555556edab20) at ../../../gtk/deprecated/gtktreerbtree.c:1434
#5 gtk_tree_rbtree_traverse_pre_order (data=0x555558c10d40, func=0x7ffff796ae30 <unselect_all_helper>, node=<optimized out>, tree=0x555556edab20) at ../../../gtk/deprecated/gtktreerbtree.c:1434
#6 gtk_tree_rbtree_traverse_pre_order (data=0x555558c10d40, func=0x7ffff796ae30 <unselect_all_helper>, node=<optimized out>, tree=0x555556edab20) at ../../../gtk/deprecated/gtktreerbtree.c:1434
#7 gtk_tree_rbtree_traverse_pre_order (tree=tree@entry=0x555556edab20, node=<optimized out>, func=func@entry=0x7ffff796ae30 <unselect_all_helper>, data=data@entry=0x555558c10d40) at ../../../gtk/deprecated/gtktreerbtree.c:1434
#8 0x00007ffff796830f in gtk_tree_rbtree_traverse_pre_order (data=<optimized out>, func=<optimized out>, node=0x55555a328010, tree=<optimized out>) at ../../../gtk/deprecated/gtktreerbtree.c:1434
#9 gtk_tree_rbtree_traverse (tree=0x555556edab20, node=<optimized out>, order=<optimized out>, func=0x7ffff796ae30 <unselect_all_helper>, data=0x555558c10d40) at ../../../gtk/deprecated/gtktreerbtree.c:1467
#10 0x00007ffff796af10 in gtk_tree_selection_real_unselect_all (selection=selection@entry=0x555557c429e0) at ../../../gtk/deprecated/gtktreeselection.c:1227
#11 0x00007ffff796bd1e in _gtk_tree_selection_internal_select_node (selection=0x555557c429e0, node=0x555558c11250, tree=0x555556edab20, path=0x555558c10500, mode=<optimized out>, override_browse_mode=0)
at ../../../gtk/deprecated/gtktreeselection.c:1555
#12 0x00007ffff7985518 in _gtk_tree_selection_internal_select_node (override_browse_mode=0, mode=<optimized out>, path=0x555558c10500, tree=<optimized out>, node=<optimized out>, selection=<optimized out>)
at ../../../gtk/deprecated/gtktreeview.c:11943
#13 gtk_tree_view_real_set_cursor (tree_view=0x555557c422d0, path=0x555558c10500, flags=(CLEAR_AND_SELECT | CURSOR_INVALID)) at ../../../gtk/deprecated/gtktreeview.c:11946
#14 0x00007ffff797fc09 in gtk_tree_view_row_deleted (model=<optimized out>, path=<optimized out>, data=<optimized out>) at ../../../gtk/deprecated/gtktreeview.c:8386
#15 0x00007ffff7e22010 in g_closure_invoke (closure=0x55555824dbe0, return_value=0x0, n_param_values=2, param_values=0x7fffffffaaa0, invocation_hint=0x7fffffffaa20) at ../../../gobject/gclosure.c:832
#16 0x00007ffff7e4f3d6 in signal_emit_unlocked_R.isra.0
(node=node@entry=0x555557045f60, detail=detail@entry=0, instance=instance@entry=0x555557c40510, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7fffffffaaa0)
at ../../../gobject/gsignal.c:3802
#17 0x00007ffff7e3f69a in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7fffffffac60) at ../../../gobject/gsignal.c:3555
#18 0x00007ffff7e3f923 in g_signal_emit (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>) at ../../../gobject/gsignal.c:3612
#19 0x00007ffff7951bce in gtk_list_store_remove (list_store=list_store@entry=0x555557c40510, iter=iter@entry=0x7fffffffad90) at ../../../gtk/deprecated/gtkliststore.c:1252
#20 0x00007ffff7951cd7 in gtk_list_store_clear (list_store=0x555557c40510) at ../../../gtk/deprecated/gtkliststore.c:1472
#21 0x00005555557ef2d4 in czkawka_gui::connect_things::connect_button_search::clean_tree_view (tree_view=0x7fffffffafa0) at czkawka_gui/src/connect_things/connect_button_search.rs:799
#22 0x00005555557eb4fb in czkawka_gui::connect_things::connect_button_search::big_files_search
(gui_data=0x5555572398f0, loaded_common_items=..., stop_receiver=..., glib_stop_sender=..., grid_progress_stages=0x55555723a1c0, progress_data_sender=...) at czkawka_gui/src/connect_things/connect_button_search.rs:408
#23 0x00005555557831f1 in czkawka_gui::connect_things::connect_button_search::connect_button_search::{closure#0} () at czkawka_gui/src/connect_things/connect_button_search.rs:118
#24 0x000055555583e769 in gtk4::auto::button::ButtonExt::connect_clicked::clicked_trampoline<gtk4::auto::button::Button, czkawka_gui::connect_things::connect_button_search::connect_button_search::{closure_env#0}>
--Type <RET> for more, q to quit, c to continue without paging--c
(this=0x5555571be9f0, f=0x5555572398f0) at /home/rafal/.cargo/registry/src/index.crates.io-6f17d22bba15001f/gtk4-0.7.3/src/auto/button.rs:487
#25 0x00007ffff7e3f83c in _g_closure_invoke_va (param_types=<optimized out>, n_params=<optimized out>, args=0x7fffffffbe10, instance=<optimized out>, return_value=<optimized out>, closure=0x555557af0950)
at ../../../gobject/gclosure.c:895
#26 g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7fffffffbe10) at ../../../gobject/gsignal.c:3462
#27 0x00007ffff7e3f923 in g_signal_emit (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>) at ../../../gobject/gsignal.c:3612
#28 0x00007ffff76af3d5 in _gtk_marshal_VOID__INT_DOUBLE_DOUBLEv
(closure=<optimized out>, return_value=<optimized out>, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x555556f059b0) at gtk/gtkmarshalers.c:5445
#29 0x00007ffff7e3f83c in _g_closure_invoke_va (param_types=<optimized out>, n_params=<optimized out>, args=0x7fffffffc0b0, instance=<optimized out>, return_value=<optimized out>, closure=0x5555571bf3d0)
at ../../../gobject/gclosure.c:895
#30 g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7fffffffc0b0) at ../../../gobject/gsignal.c:3462
#31 0x00007ffff7e3f923 in g_signal_emit (instance=instance@entry=0x5555571bf240, signal_id=<optimized out>, detail=detail@entry=0) at ../../../gobject/gsignal.c:3612
#32 0x00007ffff7746726 in gtk_gesture_click_end (gesture=0x5555571bf240, sequence=sequence@entry=0x0) at ../../../gtk/gtkgestureclick.c:275
#33 0x00007ffff7e26946 in g_cclosure_marshal_VOID__BOXEDv
(closure=0x555556f12e70, return_value=<optimized out>, instance=0x5555571bf240, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x555556f12ea0) at ../../../gobject/gmarshal.c:1686
#34 0x00007ffff7e3f83c in _g_closure_invoke_va (param_types=<optimized out>, n_params=<optimized out>, args=0x7fffffffc3d0, instance=<optimized out>, return_value=<optimized out>, closure=0x555556f12e70)
at ../../../gobject/gclosure.c:895
#35 g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7fffffffc3d0) at ../../../gobject/gsignal.c:3462
#36 0x00007ffff7e3f923 in g_signal_emit (instance=instance@entry=0x5555571bf240, signal_id=<optimized out>, detail=detail@entry=0) at ../../../gobject/gsignal.c:3612
#37 0x00007ffff77415b7 in _gtk_gesture_set_recognized (sequence=0x0, recognized=0, gesture=0x5555571bf240) at ../../../gtk/gtkgesture.c:340
#38 _gtk_gesture_check_recognized (gesture=0x5555571bf240, sequence=0x0) at ../../../gtk/gtkgesture.c:381
#39 0x00007ffff7744d7b in gtk_gesture_handle_event (controller=0x5555571bf240, event=0x555558455a10, x=63.032772064208984, y=6.3532109260559082) at ../../../gtk/gtkgesture.c:686
#40 0x00007ffff7747ce3 in gtk_gesture_single_handle_event (controller=0x5555571bf240, event=0x555558455a10, x=63.032772064208984, y=6.3532109260559082) at ../../../gtk/gtkgesturesingle.c:230
#41 0x00007ffff785aaa3 in gtk_event_controller_handle_event (y=<optimized out>, x=<optimized out>, target=<optimized out>, event=<optimized out>, controller=<optimized out>) at ../../../gtk/gtkeventcontroller.c:362
#42 gtk_widget_run_controllers (widget=widget@entry=0x5555571be9f0, event=event@entry=0x555558455a10, target=target@entry=0x5555571be9f0, x=63.032772064208984, y=6.3532109260559082, phase=phase@entry=GTK_PHASE_CAPTURE)
at ../../../gtk/gtkwidget.c:4570
#43 0x00007ffff785aca4 in _gtk_widget_captured_event (widget=0x5555571be9f0, event=0x555558455a10, target=0x5555571be9f0) at ../../../gtk/gtkwidget.c:4733
#44 0x00007ffff7a87816 in gtk_propagate_event_internal.isra.0 (widget=0x5555571be9f0, event=0x555558455a10, topmost=<optimized out>) at ../../../gtk/gtkmain.c:1924
#45 0x00007ffff777fb6d in gtk_main_do_event (event=0x555558455a10) at ../../../gtk/gtkmain.c:1698
#46 0x00007ffff786ec2c in surface_event () at ../../../gtk/gtkwindow.c:4748
#47 0x00007ffff79b2ee7 in _gdk_marshal_BOOLEAN__POINTER
(closure=0x5555572ac470, return_value=0x7fffffffc9c0, n_param_values=<optimized out>, param_values=0x7fffffffca20, invocation_hint=<optimized out>, marshal_data=<optimized out>) at gdk/gdkmarshalers.c:258
#48 0x00007ffff7a281e3 in gdk_surface_event_marshaller (closure=0x5555572ac470, return_value=0x7fffffffc9c0, n_param_values=2, param_values=0x7fffffffca20, invocation_hint=0x7fffffffc9a0, marshal_data=0x0)
at ../../../gdk/gdksurface.c:435
#49 0x00007ffff7e22010 in g_closure_invoke (closure=0x5555572ac470, return_value=0x7fffffffc9c0, n_param_values=2, param_values=0x7fffffffca20, invocation_hint=0x7fffffffc9a0) at ../../../gobject/gclosure.c:832
#50 0x00007ffff7e4f3d6 in signal_emit_unlocked_R.isra.0
(node=<optimized out>, detail=detail@entry=0, instance=instance@entry=0x5555572abe20, emission_return=emission_return@entry=0x7fffffffcb30, instance_and_params=instance_and_params@entry=0x7fffffffca20)
at ../../../gobject/gsignal.c:3802
#51 0x00007ffff7e3f0a6 in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7fffffffcbe0) at ../../../gobject/gsignal.c:3565
#52 0x00007ffff7e3f923 in g_signal_emit (instance=instance@entry=0x5555572abe20, signal_id=<optimized out>, detail=detail@entry=0) at ../../../gobject/gsignal.c:3612
#53 0x00007ffff7a808f9 in gdk_surface_handle_event.isra.0 (event=0x555558455a10) at ../../../gdk/gdksurface.c:2956
#54 0x00007ffff79f829e in gdk_event_source_dispatch.lto_priv () at ../../../gdk/x11/gdkeventsource.c:418
#55 0x00007ffff721b49d in g_main_dispatch (context=0x555556ba6db0) at ../../../glib/gmain.c:3460
#56 g_main_context_dispatch (context=0x555556ba6db0) at ../../../glib/gmain.c:4200
#57 0x00007ffff7276178 in g_main_context_iterate.constprop.0 (context=0x555556ba6db0, block=<optimized out>, dispatch=1, self=<optimized out>) at ../../../glib/gmain.c:4276
#58 0x00007ffff721a1b0 in g_main_context_iteration (context=context@entry=0x555556ba6db0, may_block=may_block@entry=1) at ../../../glib/gmain.c:4343
#59 0x00007ffff73e5c5d in g_application_run (application=0x555556ba3b80, argc=<optimized out>, argv=0x555556ba5d20) at ../../../gio/gapplication.c:2573
#60 0x0000555555742f98 in gio::application::ApplicationExtManual::run_with_args<gtk4::auto::application::Application, alloc::string::String> (self=0x7fffffffd128, args=...)
at /home/rafal/.cargo/registry/src/index.crates.io-6f17d22bba15001f/gio-0.18.2/src/application.rs:29
#61 0x0000555555868c33 in czkawka_gui::main () at czkawka_gui/src/main.rs:78
#62 0x000055555578d58b in core::ops::function::FnOnce::call_once<fn(), ()> () at /rustc/d5c2e9c342b358556da91d61ed4133f6f50fc0c3/library/core/src/ops/function.rs:250
#63 0x00005555558475ae in std::sys_common::backtrace::__rust_begin_short_backtrace<fn(), ()> (f=0x555555868b00 <czkawka_gui::main>) at /rustc/d5c2e9c342b358556da91d61ed4133f6f50fc0c3/library/std/src/sys_common/backtrace.rs:135
#64 0x0000555555709b01 in std::rt::lang_start::{closure#0}<()> () at /rustc/d5c2e9c342b358556da91d61ed4133f6f50fc0c3/library/std/src/rt.rs:166
#65 0x000055555657b54b in core::ops::function::impls::{impl#2}::call_once<(), (dyn core::ops::function::Fn<(), Output=i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)> ()
at library/core/src/ops/function.rs:284
#66 std::panicking::try::do_call<&(dyn core::ops::function::Fn<(), Output=i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32> () at library/std/src/panicking.rs:500
#67 std::panicking::try<i32, &(dyn core::ops::function::Fn<(), Output=i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe)> () at library/std/src/panicking.rs:464
#68 std::panic::catch_unwind<&(dyn core::ops::function::Fn<(), Output=i32> + core::marker::Sync + core::panic::unwind_safe::RefUnwindSafe), i32> () at library/std/src/panic.rs:142
#69 std::rt::lang_start_internal::{closure#2} () at library/std/src/rt.rs:148
#70 std::panicking::try::do_call<std::rt::lang_start_internal::{closure_env#2}, isize> () at library/std/src/panicking.rs:500
#71 std::panicking::try<isize, std::rt::lang_start_internal::{closure_env#2}> () at library/std/src/panicking.rs:464
#72 std::panic::catch_unwind<std::rt::lang_start_internal::{closure_env#2}, isize> () at library/std/src/panic.rs:142
#73 std::rt::lang_start_internal () at library/std/src/rt.rs:148
#74 0x0000555555709ada in std::rt::lang_start<()> (main=0x555555868b00 <czkawka_gui::main>, argc=1, argv=0x7fffffffd488, sigpipe=0) at /rustc/d5c2e9c342b358556da91d61ed4133f6f50fc0c3/library/std/src/rt.rs:165
#75 0x0000555555869c5e in main ()
#76 0x00007ffff6e23a90 in __libc_start_call_main (main=main@entry=0x555555869c40 <main>, argc=argc@entry=1, argv=argv@entry=0x7fffffffd488) at ../sysdeps/nptl/libc_start_call_main.h:58
#77 0x00007ffff6e23b49 in __libc_start_main_impl (main=0x555555869c40 <main>, argc=1, argv=0x7fffffffd488, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffd478)
at ../csu/libc-start.c:360
#78 0x00005555556d9825 in _start ()