jwalk/core/
run_context.rs

1use std::sync::atomic::{AtomicBool, Ordering as AtomicOrdering};
2use std::sync::Arc;
3
4use super::{ClientState, Ordered, OrderedQueue, ReadDir, ReadDirCallback, ReadDirSpec};
5use crate::Result;
6
7pub(crate) struct RunContext<C: ClientState> {
8    pub(crate) stop: Arc<AtomicBool>,
9    pub(crate) read_dir_spec_queue: OrderedQueue<ReadDirSpec<C>>,
10    pub(crate) read_dir_result_queue: OrderedQueue<Result<ReadDir<C>>>,
11    pub(crate) core_read_dir_callback: Arc<ReadDirCallback<C>>,
12}
13
14impl<C: ClientState> RunContext<C> {
15    pub(crate) fn stop(&self) {
16        self.stop.store(true, AtomicOrdering::SeqCst);
17    }
18
19    pub(crate) fn schedule_read_dir_spec(&self, ordered_read_dir: Ordered<ReadDirSpec<C>>) -> bool {
20        self.read_dir_spec_queue.push(ordered_read_dir).is_ok()
21    }
22
23    pub(crate) fn send_read_dir_result(
24        &self,
25        read_dir_result: Ordered<Result<ReadDir<C>>>,
26    ) -> bool {
27        self.read_dir_result_queue.push(read_dir_result).is_ok()
28    }
29
30    pub(crate) fn complete_item(&self) {
31        self.read_dir_spec_queue.complete_item()
32    }
33}
34
35impl<C: ClientState> Clone for RunContext<C> {
36    fn clone(&self) -> Self {
37        RunContext {
38            stop: self.stop.clone(),
39            read_dir_spec_queue: self.read_dir_spec_queue.clone(),
40            read_dir_result_queue: self.read_dir_result_queue.clone(),
41            core_read_dir_callback: self.core_read_dir_callback.clone(),
42        }
43    }
44}