object-controller-tracker
A crate used to keep track of Object-Controller
pairs, where a
Controller
is used to operate on the Object
(e.g. to cancel it),
usually from an other thread.
A Tracker object is constructed and used to
register Object-Controller
pairs. When an Object
is dropped, the
Controller
is automatically unregistered. The
Tracker object can be used to operate on
all registered objects through their associated controllers.
Example
struct Object {
stop: Arc<AtomicBool>,
}
struct Controller(Arc<AtomicBool>);
impl Object {
fn new2() -> (Object, Controller) {
let stop = Arc::new(AtomicBool::new(false));
let ctl_stop = Arc::clone(&stop);
(Object { stop }, Controller(ctl_stop))
}
fn do_something(&self) {
while !self.stop.load(Ordering::SeqCst) {
println!("Do something.");
std::thread::sleep(Duration::from_secs(1));
}
}
}
impl Controller {
fn cancel(&self) {
self.0.store(true, Ordering::SeqCst);
}
}
fn main() {
let mut tracker = Tracker::new();
let tracker2 = tracker.clone();
let thread = std::thread::spawn(move || {
let (object, controller) = Object::new2();
let object = tracker2.track(object, controller);
object.do_something();
});
std::thread::sleep(Duration::from_secs(5));
tracker.for_each(|r| r.cancel());
thread.join().unwrap();
}
License: MIT/Apache2.0