diff --git a/server/src/commands/serve.rs b/server/src/commands/serve.rs index 456e7c6d..3659ad87 100644 --- a/server/src/commands/serve.rs +++ b/server/src/commands/serve.rs @@ -1,8 +1,9 @@ +use std::collections::HashMap; use std::path::PathBuf; use std::process; -use std::time::Instant; -use std::collections::HashMap; +use std::sync::{Arc, Mutex}; use std::thread; +use std::time::Instant; use rand; @@ -55,10 +56,22 @@ pub fn serve(project_path: &PathBuf, port: Option) { println!("Using session config {:#?}", config); - let mut session = FsSession::new(&config); - session.init(); + let session = { + let mut session = FsSession::new(config.clone()); + session.init(); + + Arc::new(Mutex::new(session)) + }; + + // TODO: Let FsSession handle the main loop and spawn a bunch of threads + // ...since Rust stable doesn't have a channel select implementation + thread::spawn(move || { + loop { + session.lock().unwrap().step(); + } + }); loop { - session.step(); + thread::park(); } } diff --git a/server/src/fs_session.rs b/server/src/fs_session.rs index 5d2fd975..0d609a54 100644 --- a/server/src/fs_session.rs +++ b/server/src/fs_session.rs @@ -27,8 +27,8 @@ pub enum FileItem { }, } -pub struct FsSession<'a> { - pub config: &'a SessionConfig, +pub struct FsSession { + pub config: SessionConfig, /// The in-memory files associated with each partition. pub partition_files: HashMap, @@ -36,10 +36,10 @@ pub struct FsSession<'a> { watchers: HashMap, } -impl<'a> FsSession<'a> { - pub fn new(config: &SessionConfig) -> FsSession { +impl FsSession { + pub fn new(config: SessionConfig) -> FsSession { FsSession { - config, + config: config, partition_files: HashMap::new(), watchers: HashMap::new(), }