From af79f6d2a35a1b03898f80e4b11253db60f9ea00 Mon Sep 17 00:00:00 2001 From: Edward Shen Date: Wed, 1 May 2019 13:22:23 -0400 Subject: [PATCH] background updating works --- src/handlers.rs | 22 +++++++++++++++------- src/main.rs | 3 ++- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/handlers.rs b/src/handlers.rs index 54b66ce..f8f314d 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -7,7 +7,7 @@ use actix_web::{ use reqwest::{Client, Url, UrlError}; use serde::Serialize; -use std::sync::{Arc, MutexGuard, RwLock, RwLockWriteGuard}; +use std::sync::{Arc, RwLock}; use tera::{Context, Tera}; #[derive(Clone, Serialize, Default, Debug)] @@ -45,13 +45,21 @@ pub fn json_endpoint(state: Data) -> HttpResponse { HttpResponse::Ok().json(&state.statuses) } -pub fn update_state(mut state: RwLockWriteGuard) -> RwLockWriteGuard { - if EpochTimestamp::now() - state.last_update >= state.refresh_time { - state.last_update = EpochTimestamp::now(); - state.statuses = update_status(&state.config); +pub fn update_state(state: State) { + let mut new_timestamp = None; + let mut new_statuses = None; + { + let read_state = state.read().unwrap(); + if EpochTimestamp::now() - read_state.last_update >= read_state.refresh_time { + new_timestamp = Some(EpochTimestamp::now()); + new_statuses = Some(update_status(&read_state.config)); + } + } + if new_timestamp.is_some() { + let mut write_state = state.try_write().expect("Could not unlock"); + write_state.last_update = new_timestamp.unwrap(); + write_state.statuses = new_statuses.unwrap(); } - - state } fn update_status(config: &Config) -> Vec { diff --git a/src/main.rs b/src/main.rs index 864a3fa..ec03694 100644 --- a/src/main.rs +++ b/src/main.rs @@ -62,7 +62,8 @@ fn main() { tokio::spawn( Interval::new_interval(Duration::from_millis(5000)) .for_each(move |_| { - let _ = update_state(clone_state.write().unwrap()); + let state = Arc::clone(&clone_state); + update_state(state); Ok(()) }) .map_err(|_| ()),