slint-ui / slint

Slint is a declarative GUI toolkit to build native user interfaces for Rust, C++, or JavaScript apps.
https://slint.dev
Other
17.11k stars 578 forks source link

`assertion failed: !timer.being_activated` #6187

Open Enyium opened 2 weeks ago

Enyium commented 2 weeks ago

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:

thread 'main' panicked at C:\Users\...\.cargo\registry\src\index.crates.io-6f17d22bba15001f\i-slint-core-1.7.2\timers.rs:260:21:
assertion failed: !timer.being_activated

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 my App struct by setting the respective struct field to None. In my app, I often drop Timers like this without stopping them first.

tronical commented 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 :-/

tronical commented 2 weeks ago

(cc @ogoffart - would this area be... acceptable?)

Enyium commented 2 weeks ago

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:


I've just repeated the process many times, but couldn't reproduce the panic. It may be a heisenbug.

ogoffart commented 2 weeks ago

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.

Enyium commented 4 days ago

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()?;