Open Enyium opened 2 weeks ago
Is it possible perhaps that the timer was dropped in its own timeout callback?
(In any case, this is a bug, but we need to find a way to reproduce it :-/
(cc @ogoffart - would this area be... acceptable?)
Is it possible perhaps that the timer was dropped in its own timeout callback?
I use the Timer
instance that this panic should've been associated with in the following way:
App::on_timer(&mut self, self_weak: rc::Weak<RefCell<App>>)
be the timer callback.on_timer()
is called manually.on_timer()
creates a new Timer
, starts it with timer.start(TimerMode::SingleShot, ...)
and saves it in the App
instance. When the sequence shouldn't be continued, None
is saved instead.on_timer()
.I've just repeated the process many times, but couldn't reproduce the panic. It may be a heisenbug.
I thought it happens if, for example, one call slint::platform::update_timers_and_animations()
from a timer callback, but i tried to reproduce with this code:
let t1 = Timer::default();
t1.start(TimerMode::Repeated, Duration::from_millis(1), move || {
slint::platform::update_timers_and_animations();
});
and we get another panic ("Recursion in timer code" line 257) so that's not the same.
I would love to see a reproducable test case. or even just a backtrace.
I would love to see [...] even just a backtrace.
After always running my app with $env:RUST_BACKTRACE=1; cargo run
since posting this issue, I got the following also timer-related panic, that doesn't show the same error message, though:
thread 'main' panicked at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-core-1.8.0\timers.rs:267:51:
invalid key
stack backtrace:
0: std::panicking::begin_panic_handler
at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library\std\src\panicking.rs:652
1: core::panicking::panic_fmt
at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library\core\src\panicking.rs:72
2: core::panicking::panic
at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9/library\core\src\panicking.rs:146
3: slab::impl$5::index_mut<i_slint_core::timers::TimerData>
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\slab-0.4.9\src\lib.rs:1220
4: i_slint_core::timers::impl$2::maybe_activate_timers::closure$1
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-core-1.8.0\timers.rs:267
5: std::thread::local::LocalKey<core::cell::RefCell<i_slint_core::timers::TimerList> >::try_with<core::cell::RefCell<i_slint_core::timers::TimerList>,i_slint_core::timers::impl$2::maybe_activate_timers::closure_env$1,bool>
at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9\library\std\src\thread\local.rs:283
6: std::thread::local::LocalKey<core::cell::RefCell<i_slint_core::timers::TimerList> >::with<core::cell::RefCell<i_slint_core::timers::TimerList>,i_slint_core::timers::impl$2::maybe_activate_timers::closure_env$1,bool>
at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9\library\std\src\thread\local.rs:260
7: i_slint_core::timers::TimerList::maybe_activate_timers at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-core-1.8.0\timers.rs:256
8: i_slint_core::platform::update_timers_and_animations
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-core-1.8.0\platform.rs:236
9: i_slint_backend_winit::event_loop::impl$6::new_events
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-backend-winit-1.8.0\event_loop.rs:563
10: winit::application::impl$0::new_events<i_slint_backend_winit::event_loop::EventLoopState,i_slint_backend_winit::SlintUserEvent>
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.30.5\src\application.rs:230
11: i_slint_backend_winit::event_loop::impl$7::new_events::closure$0<i_slint_backend_winit::SlintUserEvent,ref_mut$<i_slint_backend_winit::event_loop::EventLoopState> >
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-backend-winit-1.8.0\event_loop.rs:611
12: i_slint_backend_winit::event_loop::CURRENT_WINDOW_TARGET::set<i_slint_backend_winit::event_loop::impl$7::new_events::closure_env$0<i_slint_backend_winit::SlintUserEvent,ref_mut$<i_slint_backend_winit::event_loop::EventLoopState> >,tuple$<> >
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\scoped-tls-hkt-0.1.4\src\lib.rs:265
13: i_slint_backend_winit::event_loop::impl$7::new_events<i_slint_backend_winit::SlintUserEvent,ref_mut$<i_slint_backend_winit::event_loop::EventLoopState> >
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-backend-winit-1.8.0\event_loop.rs:611
14: winit::event_loop::dispatch_event_for_app
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.30.5\src\event_loop.rs:641
15: winit::platform::run_on_demand::EventLoopExtRunOnDemand::run_app_on_demand::closure$0<winit::event_loop::EventLoop<i_slint_backend_winit::SlintUserEvent>,i_slint_backend_winit::event_loop::ActiveEventLoopSetterDuringEventProcessing<ref_mut$<i_slint_backend
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.30.5\src\platform\run_on_demand.rs:76
16: winit::platform_impl::windows::event_loop::impl$3::run_on_demand::closure$0<i_slint_backend_winit::SlintUserEvent,winit::platform::run_on_demand::EventLoopExtRunOnDemand::run_app_on_demand::closure_env$0<winit::event_loop::EventLoop<i_slint_backend_winit::
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.30.5\src\platform_impl\windows\event_loop.rs:253
17: alloc::boxed::impl$49::call_mut<tuple$<enum2$<winit::event::Event<winit::platform_impl::windows::event_loop::UserEventPlaceholder> > >,dyn$<core::ops::function::FnMut<tuple$<enum2$<winit::event::Event<winit::platform_impl::windows::event_loop::UserEventPla
at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9\library\alloc\src\boxed.rs:2070
18: winit::platform_impl::windows::event_loop::runner::impl$3::call_event_handler::closure$0<winit::platform_impl::windows::event_loop::UserEventPlaceholder>
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.30.5\src\platform_impl\windows\event_loop\runner.rs:236
19: core::panic::unwind_safe::impl$25::call_once<tuple$<>,winit::platform_impl::windows::event_loop::runner::impl$3::call_event_handler::closure_env$0<winit::platform_impl::windows::event_loop::UserEventPlaceholder> >
at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9\library\core\src\panic\unwind_safe.rs:272
20: std::panicking::try::do_call<core::panic::unwind_safe::AssertUnwindSafe<winit::platform_impl::windows::event_loop::runner::impl$3::call_event_handler::closure_env$0<winit::platform_impl::windows::event_loop::UserEventPlaceholder> >,tuple$<> >
at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9\library\std\src\panicking.rs:559
21: winit::platform_impl::windows::keyboard_layout::impl$11::default
22: std::panicking::try<tuple$<>,core::panic::unwind_safe::AssertUnwindSafe<winit::platform_impl::windows::event_loop::runner::impl$3::call_event_handler::closure_env$0<winit::platform_impl::windows::event_loop::UserEventPlaceholder> > >
at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9\library\std\src\panicking.rs:523
23: std::panic::catch_unwind<core::panic::unwind_safe::AssertUnwindSafe<winit::platform_impl::windows::event_loop::runner::impl$3::call_event_handler::closure_env$0<winit::platform_impl::windows::event_loop::UserEventPlaceholder> >,tuple$<> >
at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9\library\std\src\panic.rs:149
24: winit::platform_impl::windows::event_loop::runner::EventLoopRunner<winit::platform_impl::windows::event_loop::UserEventPlaceholder>::catch_unwind<winit::platform_impl::windows::event_loop::UserEventPlaceholder,tuple$<>,winit::platform_impl::windows::event_
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.30.5\src\platform_impl\windows\event_loop\runner.rs:173
25: winit::platform_impl::windows::event_loop::runner::EventLoopRunner<winit::platform_impl::windows::event_loop::UserEventPlaceholder>::call_event_handler<winit::platform_impl::windows::event_loop::UserEventPlaceholder>
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.30.5\src\platform_impl\windows\event_loop\runner.rs:230
26: winit::platform_impl::windows::event_loop::runner::EventLoopRunner<winit::platform_impl::windows::event_loop::UserEventPlaceholder>::call_new_events<winit::platform_impl::windows::event_loop::UserEventPlaceholder>
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.30.5\src\platform_impl\windows\event_loop\runner.rs:351
27: winit::platform_impl::windows::event_loop::runner::EventLoopRunner<winit::platform_impl::windows::event_loop::UserEventPlaceholder>::move_state_to<winit::platform_impl::windows::event_loop::UserEventPlaceholder>
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.30.5\src\platform_impl\windows\event_loop\runner.rs:308
28: winit::platform_impl::windows::event_loop::runner::EventLoopRunner<winit::platform_impl::windows::event_loop::UserEventPlaceholder>::wakeup<winit::platform_impl::windows::event_loop::UserEventPlaceholder>
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.30.5\src\platform_impl\windows\event_loop\runner.rs:205
29: winit::platform_impl::windows::event_loop::EventLoop<i_slint_backend_winit::SlintUserEvent>::wait_and_dispatch_message<i_slint_backend_winit::SlintUserEvent>
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.30.5\src\platform_impl\windows\event_loop.rs:419
30: winit::platform_impl::windows::event_loop::EventLoop<i_slint_backend_winit::SlintUserEvent>::run_on_demand<i_slint_backend_winit::SlintUserEvent,winit::platform::run_on_demand::EventLoopExtRunOnDemand::run_app_on_demand::closure_env$0<winit::event_loop::Ev
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.30.5\src\platform_impl\windows\event_loop.rs:259
31: winit::platform::run_on_demand::impl$0::run_on_demand<i_slint_backend_winit::SlintUserEvent,winit::platform::run_on_demand::EventLoopExtRunOnDemand::run_app_on_demand::closure_env$0<winit::event_loop::EventLoop<i_slint_backend_winit::SlintUserEvent>,i_slin
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.30.5\src\platform\run_on_demand.rs:89
32: winit::platform::run_on_demand::EventLoopExtRunOnDemand::run_app_on_demand<winit::event_loop::EventLoop<i_slint_backend_winit::SlintUserEvent>,i_slint_backend_winit::event_loop::ActiveEventLoopSetterDuringEventProcessing<ref_mut$<i_slint_backend_winit::eve
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.30.5\src\platform\run_on_demand.rs:75
33: i_slint_backend_winit::event_loop::EventLoopState::run at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-backend-winit-1.8.0\event_loop.rs:684
34: i_slint_backend_winit::impl$2::run_event_loop
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-backend-winit-1.8.0\lib.rs:383 35:
slint::run_event_loop::closure$0
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\slint-1.8.0\lib.rs:239
36: i_slint_backend_selector::with_platform::closure$0<tuple$<>,slint::run_event_loop::closure_env$0>
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-backend-selector-1.8.0\lib.rs:137
37: i_slint_core::context::with_global_context::closure$0<enum2$<core::result::Result<tuple$<>,enum2$<i_slint_core::api::PlatformError> > >,i_slint_backend_selector::with_global_context::closure_env$0<enum2$<core::result::Result<tuple$<>,enum2$<i_slint_core::a
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-core-1.8.0\context.rs:78
38: std::thread::local::LocalKey<once_cell::unsync::OnceCell<i_slint_core::context::SlintContext> >::try_with<once_cell::unsync::OnceCell<i_slint_core::context::SlintContext>,i_slint_core::context::with_global_context::closure_env$0<enum2$<core::result::Result
at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9\library\std\src\thread\local.rs:283
39: std::thread::local::LocalKey<once_cell::unsync::OnceCell<i_slint_core::context::SlintContext> >::with<once_cell::unsync::OnceCell<i_slint_core::context::SlintContext>,i_slint_core::context::with_global_context::closure_env$0<enum2$<core::result::Result<tup
at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9\library\std\src\thread\local.rs:260
40: i_slint_core::context::with_global_context<enum2$<core::result::Result<tuple$<>,enum2$<i_slint_core::api::PlatformError> > >,i_slint_backend_selector::with_global_context::closure_env$0<enum2$<core::result::Result<tuple$<>,enum2$<i_slint_core::api::Platfor
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-core-1.8.0\context.rs:77
41: i_slint_backend_selector::with_global_context<enum2$<core::result::Result<tuple$<>,enum2$<i_slint_core::api::PlatformError> > >,i_slint_backend_selector::with_platform::closure_env$0<tuple$<>,slint::run_event_loop::closure_env$0> >
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-backend-selector-1.8.0\lib.rs:144
42: i_slint_backend_selector::with_platform<tuple$<>,slint::run_event_loop::closure_env$0>
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-backend-selector-1.8.0\lib.rs:137
43: slint::run_event_loop
at C:\Users\redacted\.cargo\registry\src\index.crates.io-6f17d22bba15001f\slint-1.8.0\lib.rs:239
44: redacted::main
at .\src\main.rs:21
45: core::ops::function::FnOnce::call_once<enum2$<core::result::Result<tuple$<>,anyhow::Error> > (*)(),tuple$<> >
at /rustc/051478957371ee0084a7c0913941d2a8c4757bb9\library\core\src\ops\function.rs:250
note: Some details are omitted, run with `RUST_BACKTRACE=full`
for a verbose backtrace.
.\src\main.rs:21
is:
slint::run_event_loop()?;
I use Rust on Windows 10 with Slint v1.7.2.
For the first time, I encountered the following panic, which didn't happen in many cases that should be identical from my point of view:
I don't have much information about it. But I think it could have happened in the context of dropping the
Timer
that I hold in myApp
struct by setting the respective struct field toNone
. In my app, I often dropTimer
s like this without stopping them first.