(self: &Arc<Self>)
| 430 | |
| 431 | impl SimulatorSessionInner { |
| 432 | fn start_refresh_pump(self: &Arc<Self>) { |
| 433 | if self |
| 434 | .refresh_pump_running |
| 435 | .compare_exchange(false, true, Ordering::AcqRel, Ordering::Acquire) |
| 436 | .is_err() |
| 437 | { |
| 438 | return; |
| 439 | } |
| 440 | |
| 441 | let inner = self.clone(); |
| 442 | tokio::spawn(async move { |
| 443 | let mut next_tick = Instant::now(); |
| 444 | loop { |
| 445 | if inner.active_frame_subscribers.load(Ordering::Relaxed) == 0 { |
| 446 | inner.refresh_pump_running.store(false, Ordering::Release); |
| 447 | if inner.active_frame_subscribers.load(Ordering::Relaxed) == 0 { |
| 448 | break; |
| 449 | } |
| 450 | if inner |
| 451 | .refresh_pump_running |
| 452 | .compare_exchange(false, true, Ordering::AcqRel, Ordering::Acquire) |
| 453 | .is_err() |
| 454 | { |
| 455 | break; |
| 456 | } |
| 457 | } |
| 458 | |
| 459 | inner.request_refresh(); |
| 460 | let refresh_interval = shared_refresh_interval(); |
| 461 | next_tick += refresh_interval; |
| 462 | let now = Instant::now(); |
| 463 | if next_tick <= now { |
| 464 | next_tick = now + refresh_interval; |
| 465 | } |
| 466 | sleep_until(next_tick).await; |
| 467 | } |
| 468 | }); |
| 469 | } |
| 470 | |
| 471 | fn request_refresh(&self) { |
| 472 | let now = now_us(); |
no test coverage detected