use crate::Data;
use crate::Threadpool;
use crossbeam::deque::Worker;
use std::sync::Weak;
pub(crate) struct Sentry {
active: bool,
coreid: Option<usize>,
index: usize,
data: Weak<Data>,
}
impl Sentry {
pub fn new(coreid: Option<usize>, index: usize, data: Weak<Data>) -> Sentry {
Sentry {
data,
coreid,
index,
active: true,
}
}
pub fn cancel(mut self) {
self.active = false;
}
}
impl Drop for Sentry {
fn drop(&mut self) {
let Some(data) = self.data.upgrade() else {
return;
};
if self.active {
let worker = Worker::new_fifo();
{
let mut stealers = data.stealers.write();
stealers[self.index] = worker.stealer();
}
Threadpool::spin_up(self.coreid, data.clone(), worker, self.index);
}
}
}