| Crates.io | object-controller-tracker |
| lib.rs | object-controller-tracker |
| version | 0.1.0 |
| created_at | 2019-04-07 15:22:53.959143+00 |
| updated_at | 2019-04-07 15:22:53.959143+00 |
| description | Track object-controller pairs. |
| homepage | https://github.com/Emm54321/object-controller-tracker |
| repository | https://github.com/Emm54321/object-controller-tracker.git |
| max_upload_size | |
| id | 126364 |
| size | 25,922 |
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.
// The object we want to track...
struct Object {
stop: Arc<AtomicBool>,
//...
}
// ... and its associated controller.
struct Controller(Arc<AtomicBool>);
impl Object {
// Create an Object-Controller pair.
fn new2() -> (Object, Controller) {
let stop = Arc::new(AtomicBool::new(false));
let ctl_stop = Arc::clone(&stop);
(Object { stop }, Controller(ctl_stop))
}
// Some method on the object that can be cancelled through the Controller.
fn do_something(&self) {
while !self.stop.load(Ordering::SeqCst) {
println!("Do something.");
std::thread::sleep(Duration::from_secs(1));
}
}
}
impl Controller {
// Cancel an operation on the Object.
fn cancel(&self) {
self.0.store(true, Ordering::SeqCst);
}
}
fn main() {
// Create the tracker object.
let mut tracker = Tracker::new();
let tracker2 = tracker.clone();
let thread = std::thread::spawn(move || {
// Create an Object-Controller pair in some thread.
let (object, controller) = Object::new2();
// Register it with the tracker.
let object = tracker2.track(object, controller);
// Do some work with the Object.
object.do_something();
});
std::thread::sleep(Duration::from_secs(5));
// Cancel all registered Object operations.
tracker.for_each(|r| r.cancel());
thread.join().unwrap();
}
License: MIT/Apache2.0