extern crate rustc_serialize;
use self::rustc_serialize::json::Json;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::mpsc::{channel, Sender};
use std::sync::Arc;
use std::thread;
use indexing::*;
use misc::{NamedStorage, SerializationFormat, Subset};
use task::{KeyedRawStorage, Op, PlainRawStorage, TelemetryTask};
impl Service {
pub fn new(is_active: bool) -> Service {
let (sender, receiver) = channel();
thread::spawn(|| {
let mut task = TelemetryTask::new(receiver);
task.run()
});
Service {
keys_plain: KeyGenerator::new(),
keys_keyed: KeyGenerator::new(),
sender,
is_active: Arc::new(AtomicBool::new(is_active)),
}
}
pub fn to_json(&self, what: Subset, format: SerializationFormat, sender: Sender<Json>) {
self.sender
.send(Op::Serialize(what, format, sender))
.unwrap();
}
pub fn set_active(&self, value: bool) {
self.is_active.store(value, Ordering::Relaxed);
}
pub fn is_active(&self) -> bool {
self.is_active.load(Ordering::Relaxed)
}
fn register_plain(&self, name: String, storage: Box<dyn PlainRawStorage>) -> Key<Plain> {
let key = self.keys_plain.next();
let named = NamedStorage {
name,
contents: storage,
};
self.sender
.send(Op::RegisterPlain(key.index, named))
.unwrap();
key
}
fn register_keyed<T>(&self, name: String, storage: Box<dyn KeyedRawStorage>) -> Key<Keyed<T>> {
let key = self.keys_keyed.next();
let named = NamedStorage {
name,
contents: storage,
};
self.sender
.send(Op::RegisterKeyed(key.index, named))
.unwrap();
key
}
}
impl Drop for Service {
fn drop(&mut self) {
let _ = self.sender.send(Op::Terminate);
}
}
pub struct Service {
keys_plain: KeyGenerator<Plain>,
keys_keyed: KeyGenerator<Map>,
is_active: Arc<AtomicBool>,
sender: Sender<Op>,
}
impl PrivateAccess {
pub fn register_plain(
service: &Service,
name: String,
storage: Box<dyn PlainRawStorage>,
) -> Key<Plain> {
service.register_plain(name, storage)
}
pub fn register_keyed<T>(
service: &Service,
name: String,
storage: Box<dyn KeyedRawStorage>,
) -> Key<Keyed<T>> {
service.register_keyed(name, storage)
}
pub fn get_sender(service: &Service) -> &Sender<Op> {
&service.sender
}
pub fn get_is_active(service: &Service) -> &Arc<AtomicBool> {
&service.is_active
}
}
pub struct PrivateAccess;