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
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?
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?
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 馃槩)
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 -))
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
.handler
.borrow_mut()
.mouse_move(&mouse_event);
Everything works as it should.
I will continue investigating why do we need it.
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.
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