From f357316797b09107fd07397f8255a92825dc0dd3 Mon Sep 17 00:00:00 2001 From: Edward Shen Date: Wed, 1 May 2019 12:58:10 -0400 Subject: [PATCH] IT WORKS --- src/handlers.rs | 29 +++++++---------------------- src/main.rs | 23 +++++++++++++---------- src/utils.rs | 2 +- 3 files changed, 21 insertions(+), 33 deletions(-) diff --git a/src/handlers.rs b/src/handlers.rs index f55a15c..54b66ce 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -7,10 +7,10 @@ use actix_web::{ use reqwest::{Client, Url, UrlError}; use serde::Serialize; -use std::sync::{Arc, Mutex, MutexGuard}; +use std::sync::{Arc, MutexGuard, RwLock, RwLockWriteGuard}; use tera::{Context, Tera}; -#[derive(Clone, Serialize, Default)] +#[derive(Clone, Serialize, Default, Debug)] pub struct Status { status: u8, location: String, @@ -19,7 +19,7 @@ pub struct Status { error: Option, } -#[derive(Serialize)] +#[derive(Serialize, Debug)] pub struct QueryResults { pub last_update: EpochTimestamp, pub refresh_time: u64, @@ -27,25 +27,10 @@ pub struct QueryResults { pub statuses: Vec, } -type State = Arc>; - -// impl State { -// pub fn new(config: &Config) -> Self { -// State(Arc::from(Mutex::from(QueryResults { -// last_update: EpochTimestamp::now(), -// refresh_time: config.refresh_time.clone(), -// config: config.clone(), -// statuses: vec![], -// }))) -// } - -// fn lock(&self) -> MutexGuard { -// self.0.lock().unwrap() -// } -// } +type State = Arc>; pub fn index(tmpl: Data, state: Data) -> WebResult { - let state = update_state(state.lock().unwrap()); + let state = state.read().unwrap(); let mut ctx = Context::new(); ctx.insert("results", &*state); let s = tmpl.render("index.html", &ctx).map_err(|e| { @@ -56,11 +41,11 @@ pub fn index(tmpl: Data, state: Data) -> WebResult) -> HttpResponse { - let state = update_state(state.lock().unwrap()); + let state = state.read().unwrap(); HttpResponse::Ok().json(&state.statuses) } -fn update_state(mut state: MutexGuard) -> MutexGuard { +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); diff --git a/src/main.rs b/src/main.rs index df31677..864a3fa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,9 +19,8 @@ use actix::System; use actix_web::{middleware::Logger, web::resource, App, HttpServer}; use ron::de::from_str; use std::{ - error::Error, fs::read_to_string, - sync::{Arc, Mutex}, + sync::{Arc, RwLock}, time::Duration, }; use tokio::prelude::{Future, Stream}; @@ -29,25 +28,28 @@ use tokio::timer::Interval; fn main() { System::run(move || { - let config = from_str::(&read_to_string("./endstat_conf.ron").expect("Could not find config file")).unwrap(); + let config = from_str::( + &read_to_string("./endstat_conf.ron").expect("Could not find config file"), + ) + .unwrap(); let bind_addr = config.bind_address.clone(); std::env::set_var("RUST_LOG", "actix_web=info"); env_logger::init(); - let state = Arc::from(Mutex::from(QueryResults { + let state = Arc::new(RwLock::new(QueryResults { last_update: EpochTimestamp::now(), refresh_time: config.refresh_time.clone(), config: config.clone(), statuses: vec![], })); - let state1 = state.clone(); - let state2 = state.clone(); + let clone_state = Arc::clone(&state); HttpServer::new(move || { let tera = compile_templates!(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*")); + let state = Arc::clone(&state); App::new() - .data(state1) + .data(state) .data(tera) .wrap(Logger::default()) .service(resource("/").to(index)) @@ -59,11 +61,12 @@ fn main() { tokio::spawn( Interval::new_interval(Duration::from_millis(5000)) - .for_each(|_| { - println!("Every 5 seconds"); + .for_each(move |_| { + let _ = update_state(clone_state.write().unwrap()); Ok(()) }) .map_err(|_| ()), ); - }).expect("Could not run system!"); + }) + .expect("Could not run system!"); } diff --git a/src/utils.rs b/src/utils.rs index 8a4bd56..a020ae8 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -5,7 +5,7 @@ use std::{ time::{SystemTime, UNIX_EPOCH}, }; -#[derive(PartialEq, PartialOrd, Copy, Clone)] +#[derive(PartialEq, PartialOrd, Copy, Clone, Debug)] pub struct EpochTimestamp(SystemTime); impl EpochTimestamp {