Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The SHOW_OPEN_PANEL command panics on gtk #571

Closed
Giesch opened this issue Feb 20, 2020 · 7 comments · Fixed by #837
Closed

The SHOW_OPEN_PANEL command panics on gtk #571

Giesch opened this issue Feb 20, 2020 · 7 comments · Fixed by #837
Labels
crash causes panic or segfault shell/gtk concerns the GTK backend

Comments

@Giesch
Copy link
Contributor

Giesch commented Feb 20, 2020

This is where the panic happens. I'm not sure what the real root cause is. That code is new from #552, but this comment looks suspicious.

backtrace:

thread '<unnamed>' panicked at 'already borrowed: BorrowMutError', src/libcore/result.rs:1165:5
stack backtrace:
   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.40/src/backtrace/libunwind.rs:88
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.40/src/backtrace/mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at src/libstd/sys_common/backtrace.rs:77
   3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
             at src/libstd/sys_common/backtrace.rs:61
   4: core::fmt::write
             at src/libcore/fmt/mod.rs:1028
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1412
   6: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:65
   7: std::sys_common::backtrace::print
             at src/libstd/sys_common/backtrace.rs:50
   8: std::panicking::default_hook::{{closure}}
             at src/libstd/panicking.rs:188
   9: std::panicking::default_hook
             at src/libstd/panicking.rs:205
  10: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:464
  11: std::panicking::continue_panic_fmt
             at src/libstd/panicking.rs:373
  12: rust_begin_unwind
             at src/libstd/panicking.rs:302
  13: core::panicking::panic_fmt
             at src/libcore/panicking.rs:139
  14: core::result::unwrap_failed
             at src/libcore/result.rs:1165
  15: core::result::Result<T,E>::expect
             at /rustc/73528e339aae0f17a15ffa49a8ac608f50c6cf14/src/libcore/result.rs:960
  16: core::cell::RefCell<T>::borrow_mut
             at /rustc/73528e339aae0f17a15ffa49a8ac608f50c6cf14/src/libcore/cell.rs:869
  17: druid_shell::platform::gtk::window::WindowBuilder::build::{{closure}}
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid-shell/src/platform/gtk/window.rs:316
  18: <O as gtk::auto::widget::WidgetExt>::connect_leave_notify_event::leave_notify_event_trampoline
             at /home/dan/.cargo/registry/src/github.com-1ecc6299db9ec823/gtk-0.8.1/src/auto/widget.rs:4154
  19: <unknown>
  20: <unknown>
  21: g_signal_emit_valist
  22: g_signal_emit
  23: <unknown>
  24: <unknown>
  25: <unknown>
  26: <unknown>
  27: <unknown>
  28: <unknown>
  29: <unknown>
  30: <unknown>
  31: <unknown>
  32: <unknown>
  33: g_closure_invoke
  34: <unknown>
  35: g_signal_emit_valist
  36: g_signal_emit
  37: gtk_widget_show
  38: gtk_native_dialog_show
  39: gtk_native_dialog_run
  40: <O as gtk::auto::native_dialog::NativeDialogExt>::run
             at /home/dan/.cargo/registry/src/github.com-1ecc6299db9ec823/gtk-0.8.1/src/auto/native_dialog.rs:152
  41: druid_shell::platform::gtk::dialog::get_file_dialog_path
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid-shell/src/platform/gtk/dialog.rs:44
  42: druid_shell::platform::gtk::window::WindowHandle::file_dialog
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid-shell/src/platform/gtk/window.rs:584
  43: druid_shell::platform::gtk::window::WindowHandle::open_file_sync
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid-shell/src/platform/gtk/window.rs:480
  44: druid_shell::window::WindowHandle::open_file_sync
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid-shell/src/window.rs:163
  45: druid::win_handler::AppState<T>::show_open_panel::{{closure}}
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid/src/win_handler.rs:530
  46: core::option::Option<T>::and_then
             at /rustc/73528e339aae0f17a15ffa49a8ac608f50c6cf14/src/libcore/option.rs:655
  47: druid::win_handler::AppState<T>::show_open_panel
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid/src/win_handler.rs:530
  48: druid::win_handler::AppState<T>::handle_cmd
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid/src/win_handler.rs:506
  49: druid::win_handler::AppState<T>::process_commands
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid/src/win_handler.rs:457
  50: druid::win_handler::AppState<T>::do_window_event
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid/src/win_handler.rs:433
  51: <druid::win_handler::DruidHandler<T> as druid_shell::window::WinHandler>::mouse_up
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid/src/win_handler.rs:634
  52: druid_shell::platform::gtk::window::WindowBuilder::build::{{closure}}
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid-shell/src/platform/gtk/window.rs:272
  53: <O as gtk::auto::widget::WidgetExt>::connect_button_release_event::button_release_event_trampoline
             at /home/dan/.cargo/registry/src/github.com-1ecc6299db9ec823/gtk-0.8.1/src/auto/widget.rs:3096
  54: <unknown>
  55: g_closure_invoke
  56: <unknown>
  57: g_signal_emit_valist
  58: g_signal_emit
  59: <unknown>
  60: <unknown>
  61: gtk_main_do_event
  62: <unknown>
  63: <unknown>
  64: g_main_context_dispatch
  65: <unknown>
  66: g_main_context_iteration
  67: g_application_run
  68: <O as gio::application::ApplicationExtManual>::run
             at /home/dan/.cargo/registry/src/github.com-1ecc6299db9ec823/gio-0.8.1/src/application.rs:23
  69: druid_shell::platform::gtk::application::Application::run::{{closure}}
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid-shell/src/platform/gtk/application.rs:70
  70: std::thread::local::LocalKey<T>::try_with
             at /rustc/73528e339aae0f17a15ffa49a8ac608f50c6cf14/src/libstd/thread/local.rs:262
  71: std::thread::local::LocalKey<T>::with
             at /rustc/73528e339aae0f17a15ffa49a8ac608f50c6cf14/src/libstd/thread/local.rs:239
  72: druid_shell::platform::gtk::application::Application::run
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid-shell/src/platform/gtk/application.rs:69
  73: druid_shell::application::Application::run
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid-shell/src/application.rs:53
  74: druid::app::AppLauncher<T>::launch
             at /home/dan/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/a0de2a1/druid/src/app.rs:124
  75: music_player::launch_ui
             at src/lib.rs:142
  76: music_player::main::{{closure}}
             at src/main.rs:13

@cmyr
Copy link
Member

cmyr commented Feb 20, 2020

interesting. That comment refers to an attempt to avoid this problem; instead of holding the borrow we clone the handle and release the borrow before we try to show the open panel, but it's very possible that I messed something else up in that refactor. Does everything work in 94ebecd?

@cmyr cmyr added crash causes panic or segfault shell/gtk concerns the GTK backend labels Feb 20, 2020
@Giesch
Copy link
Contributor Author

Giesch commented Feb 29, 2020

It also crashes on that branch, with the same error. Here's a minimal version.

I'm not really familiar with RC, but it looks like maybe we're still in the scope of the borrow from the button release event on line 53 of the trace above?

@cmyr
Copy link
Member

cmyr commented Feb 29, 2020

yea, there's something quite broken in the gtk backend on master, I haven't had a chance to really dig into it (and probably actually won't for a few weeks 😢)

@Dmitry-Borodin
Copy link
Collaborator

Dmitry-Borodin commented Mar 7, 2020

reproduced sample in a project to work on it https://github.com/Dmitry-Borodin/druid/blob/crashfix-gtk-open-panel/druid/examples/crash_show_open_panel.rs
(now I have this issue in resents and can find it -))

@Dmitry-Borodin
Copy link
Collaborator

Dmitry-Borodin commented Mar 7, 2020

Panic happening because we borrowing Handle in
druid/src/win_handler.rs:533
to open_file_dialog() and then trying to borrow the same handler in
druid-shell/src/platform/gtk/window.rs:332
It feels good for me when I comment out those lines

                state
                    .handler
                    .borrow_mut()
                    .mouse_move(&mouse_event);

Everything works as it should.
I will continue investigating why do we need it.

@Giesch
Copy link
Contributor Author

Giesch commented Mar 7, 2020

I tried that as well, but the borrow was to fix the bug in the gif on #552. I think it only feels good for the file dialog because the window is being replaced. It looks like there might be a more fundamental problem that one callback triggering another callback is going to have this problem in general.

@jneem
Copy link
Collaborator

jneem commented Mar 28, 2020

I ran into a similar (but not identical) double-borrow-mut error while trying to show the save panel. The relevant part of the backtrace follows, and the borrow_mut is first taken in frame 61, and then again in frame 16.

  14: core::result::Result<T,E>::expect
             at /rustc/b8cedc00407a4c56a3bda1ed605c6fc166655447/src/libcore/result.rs:991
  15: core::cell::RefCell<T>::borrow_mut
             at /rustc/b8cedc00407a4c56a3bda1ed605c6fc166655447/src/libcore/cell.rs:878
  16: druid_shell::platform::gtk::window::WindowBuilder::build::{{closure}}
             at /home/jneeman/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/ace3959/druid-shell/src/platform/gtk/window.rs:256
  17: <O as gtk::auto::widget::WidgetExt>::connect_draw::draw_trampoline
             at /home/jneeman/.cargo/registry/src/github.com-1ecc6299db9ec823/gtk-0.8.1/src/auto/widget.rs:3686
  18: <unknown>
  19: <unknown>
  20: g_signal_emit_valist
  21: g_signal_emit
  22: <unknown>
  23: gtk_container_propagate_draw
  24: <unknown>
  25: <unknown>
  26: <unknown>
  27: <unknown>
  28: <unknown>
  29: <unknown>
  30: gtk_container_propagate_draw
  31: <unknown>
  32: <unknown>
  33: <unknown>
  34: <unknown>
  35: gtk_main_do_event
  36: <unknown>
  37: <unknown>
  38: <unknown>
  39: <unknown>
  40: g_signal_emit_valist
  41: g_signal_emit
  42: <unknown>
  43: <unknown>
  44: <unknown>
  45: g_main_context_dispatch
  46: <unknown>
  47: g_main_loop_run
  48: gtk_native_dialog_run
  49: <O as gtk::auto::native_dialog::NativeDialogExt>::run
             at /home/jneeman/.cargo/registry/src/github.com-1ecc6299db9ec823/gtk-0.8.1/src/auto/native_dialog.rs:152
  50: druid_shell::platform::gtk::dialog::get_file_dialog_path
             at /home/jneeman/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/ace3959/druid-shell/src/platform/gtk/dialog.rs:48
  51: druid_shell::platform::gtk::window::WindowHandle::file_dialog
             at /home/jneeman/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/ace3959/druid-shell/src/platform/gtk/window.rs:621
  52: druid_shell::platform::gtk::window::WindowHandle::save_as_sync
             at /home/jneeman/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/ace3959/druid-shell/src/platform/gtk/window.rs:523
  53: druid_shell::window::WindowHandle::save_as_sync
             at /home/jneeman/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/ace3959/druid-shell/src/window.rs:180
  54: druid::win_handler::AppState<T>::show_save_panel::{{closure}}
             at /home/jneeman/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/ace3959/druid/src/win_handler.rs:551
  55: core::option::Option<T>::and_then
             at /rustc/b8cedc00407a4c56a3bda1ed605c6fc166655447/src/libcore/option.rs:658
  56: druid::win_handler::AppState<T>::show_save_panel
             at /home/jneeman/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/ace3959/druid/src/win_handler.rs:551
  57: druid::win_handler::AppState<T>::handle_cmd
             at /home/jneeman/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/ace3959/druid/src/win_handler.rs:510
  58: druid::win_handler::AppState<T>::process_commands
             at /home/jneeman/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/ace3959/druid/src/win_handler.rs:461
  59: druid::win_handler::AppState<T>::handle_system_cmd
             at /home/jneeman/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/ace3959/druid/src/win_handler.rs:490
  60: <druid::win_handler::DruidHandler<T> as druid_shell::window::WinHandler>::command
             at /home/jneeman/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/ace3959/druid/src/win_handler.rs:622
  61: druid_shell::platform::gtk::menu::Menu::append_items_to_menu::{{closure}}
             at /home/jneeman/.cargo/git/checkouts/druid-1a6b6c4d20db75fe/ace3959/druid-shell/src/platform/gtk/menu.rs:90
  62: <O as gtk::auto::menu_item::GtkMenuItemExt>::connect_activate::activate_trampoline
             at /home/jneeman/.cargo/registry/src/github.com-1ecc6299db9ec823/gtk-0.8.1/src/auto/menu_item.rs:684
  63: g_closure_invoke

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
crash causes panic or segfault shell/gtk concerns the GTK backend
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants