diff --git a/src/files.rs b/src/files.rs index 40d5ac0..424b648 100644 --- a/src/files.rs +++ b/src/files.rs @@ -457,41 +457,8 @@ impl Hash for File { impl Eq for File {} -impl Clone for File { - fn clone(&self) -> Self { - let meta = self.meta.value.clone(); - let meta = match meta { - Ok(meta) => Async::new_with_value(meta.clone()), - Err(_) => File::make_async_meta(&self.path, self.dirty_meta.clone()) - }; - let dirsize = if let Some(ref dirsize) = self.dirsize { - let dirsize = dirsize.value.clone(); - let dirsize = match dirsize { - Ok(dirsize) => Async::new_with_value(dirsize), - Err(_) => File::make_async_dirsize(&self.path, - self.dirty_meta.clone()) - }; - Some(dirsize) - } else { None }; - - File { - name: self.name.clone(), - path: self.path.clone(), - kind: self.kind.clone(), - dirsize: dirsize, - target: self.target.clone(), - color: self.color.clone(), - meta: meta, - dirty_meta: self.dirty_meta.clone(), - meta_processed: self.meta_processed.clone(), - selected: self.selected.clone(), - tag: self.tag.clone() - } - } -} - -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct File { pub name: String, pub path: PathBuf, diff --git a/src/preview.rs b/src/preview.rs index 858c6c2..da2a90a 100644 --- a/src/preview.rs +++ b/src/preview.rs @@ -51,11 +51,12 @@ impl Debug for Async { } +#[derive(Clone)] pub struct Async { pub value: HResult, async_value: AsyncValue, - async_closure: Option>, - on_ready: Option>, + async_closure: Arc>>>, + on_ready: Arc>>>, stale: Stale } @@ -65,8 +66,8 @@ impl Async { let async_value = Async { value: HError::async_not_ready(), async_value: Arc::new(Mutex::new(None)), - async_closure: Some(closure), - on_ready: None, + async_closure: Arc::new(Mutex::new(Some(closure))), + on_ready: Arc::new(Mutex::new(None)), stale: Arc::new(Mutex::new(false)) }; async_value @@ -76,17 +77,17 @@ impl Async { Async { value: Ok(val), async_value: Arc::new(Mutex::new(None)), - async_closure: None, - on_ready: None, + async_closure: Arc::new(Mutex::new(None)), + on_ready: Arc::new(Mutex::new(None)), stale: Arc::new(Mutex::new(false)) } } pub fn run(&mut self) -> HResult<()> { - let closure = self.async_closure.take()?; + let closure = self.async_closure.lock()?.take()?; let async_value = self.async_value.clone(); let stale = self.stale.clone(); - let on_ready_fn = self.on_ready.take(); + let on_ready_fn = self.on_ready.lock()?.take(); std::thread::spawn(move|| -> HResult<()> { let mut value = closure(stale); @@ -104,10 +105,10 @@ impl Async { } pub fn run_pooled(&mut self, pool: &ThreadPool) -> HResult<()> { - let closure = self.async_closure.take()?; + let closure = self.async_closure.lock()?.take()?; let async_value = self.async_value.clone(); let stale = self.stale.clone(); - let on_ready_fn = self.on_ready.take(); + let on_ready_fn = self.on_ready.lock()?.take(); pool.spawn(move || { let mut value = closure(stale); @@ -126,9 +127,9 @@ impl Async { } pub fn wait(&mut self) -> HResult<()> { - let closure = self.async_closure.take()?; + let closure = self.async_closure.lock()?.take()?; let mut value = closure(self.stale.clone()); - let on_ready_fn = self.on_ready.take(); + let on_ready_fn = self.on_ready.lock()?.take(); if let Ok(ref mut value) = value { @@ -185,7 +186,7 @@ impl Async { pub fn on_ready(&mut self, fun: AsyncReadyFn) { - self.on_ready = Some(fun); + *self.on_ready.lock().unwrap() = Some(fun); } }