storage/
client_storage.rs1use std::path::PathBuf;
6use std::thread;
7
8use base::generic_channel::{self, GenericReceiver, GenericSender};
9use storage_traits::client_storage::ClientStorageThreadMessage;
10
11pub trait ClientStorageThreadFactory {
12 fn new(config_dir: Option<PathBuf>) -> Self;
13}
14
15impl ClientStorageThreadFactory for GenericSender<ClientStorageThreadMessage> {
16 fn new(config_dir: Option<PathBuf>) -> GenericSender<ClientStorageThreadMessage> {
17 let (generic_sender, generic_receiver) = generic_channel::channel().unwrap();
18
19 let generic_sender_clone = generic_sender.clone();
20
21 thread::Builder::new()
22 .name("ClientStorageThread".to_owned())
23 .spawn(move || {
24 ClientStorageThread::new(config_dir, generic_sender, generic_receiver).start();
25 })
26 .expect("Thread spawning failed");
27
28 generic_sender_clone
29 }
30}
31
32pub struct ClientStorageThread {
33 _base_dir: PathBuf,
34 _generic_sender: GenericSender<ClientStorageThreadMessage>,
35 generic_receiver: GenericReceiver<ClientStorageThreadMessage>,
36}
37
38impl ClientStorageThread {
39 pub fn new(
40 config_dir: Option<PathBuf>,
41 generic_sender: GenericSender<ClientStorageThreadMessage>,
42 generic_receiver: GenericReceiver<ClientStorageThreadMessage>,
43 ) -> ClientStorageThread {
44 let base_dir = config_dir
45 .unwrap_or_else(|| PathBuf::from("."))
46 .join("clientstorage");
47
48 ClientStorageThread {
49 _base_dir: base_dir,
50 _generic_sender: generic_sender,
51 generic_receiver,
52 }
53 }
54
55 pub fn start(&mut self) {
56 #[allow(clippy::never_loop)]
57 loop {
58 match self.generic_receiver.recv().unwrap() {
59 ClientStorageThreadMessage::Exit(sender) => {
60 let _ = sender.send(());
61 return;
62 },
63 }
64 }
65 }
66}