use super::db::SignalDB;
use std::default::Default;
use std::io;
use std::sync::Arc;
use std::thread;
pub struct AsyncSignalDB {
pub sync_db: Arc<SignalDB>,
workers: Vec<thread::JoinHandle<()>>,
}
impl Default for AsyncSignalDB {
fn default() -> Self {
Self::new()
}
}
impl AsyncSignalDB {
pub fn new() -> Self {
AsyncSignalDB {
sync_db: Arc::new(SignalDB::new()),
workers: Vec::new(),
}
}
pub fn parse_vcd<I>(&mut self, input: I)
where
I: io::BufRead + std::marker::Send + 'static,
{
let db_parse = Arc::clone(&self.sync_db);
self.workers.push(thread::spawn(move || {
let _ = db_parse.parse_vcd(input);
}))
}
pub fn search(&mut self, expr: &str) {
let db_search = Arc::clone(&self.sync_db);
let expr = expr.to_string();
self.workers.push(thread::spawn(move || {
if let Err(e) = db_search.search_init(&expr) {
db_search.set_status(format!("Cannot initialize search: {}: {}", expr, e).as_str())
};
for timestamp in db_search.get_timestamps() {
if let Err(e) = db_search.search_at(&expr, timestamp) {
db_search
.set_status(format!("Invalid search expression: {}: {}", expr, e).as_str());
return;
}
}
let _ = db_search.finish_search(&expr);
}))
}
}