use futures::{executor::LocalPool, task::LocalSpawnExt}; use std::{cell::RefCell, rc::Rc}; async fn timer_task(mut t: r2r::Timer) -> Result<(), Box> { let mut x: i32 = 0; loop { let elapsed = t.tick().await?; println!("timer called ({}), {}us since last call", x, elapsed.as_micros()); x += 1; if x == 10 { break; } } Ok(()) } fn main() -> Result<(), Box> { let ctx = r2r::Context::create()?; let mut node = r2r::Node::create(ctx, "testnode", "")?; let timer = node.create_wall_timer(std::time::Duration::from_millis(1000))?; let mut pool = LocalPool::new(); let spawner = pool.spawner(); let is_done = Rc::new(RefCell::new(false)); let task_is_done = is_done.clone(); spawner.spawn_local(async move { match timer_task(timer).await { Ok(()) => { *task_is_done.borrow_mut() = true; println!("exiting"); } Err(e) => println!("error: {}", e), } })?; while !*is_done.borrow() { node.spin_once(std::time::Duration::from_millis(100)); pool.run_until_stalled(); } Ok(()) }