storage/
client_storage.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use 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}