use std::{
cell::Cell,
sync::Arc,
};
use crossbeam_deque::Worker;
use super::worker_queue::WorkerQueue;
use crate::thread_pool::PoolJob;
pub(crate) struct WorkerRuntime {
pub(crate) queue: Arc<WorkerQueue>,
pub(crate) local: Worker<PoolJob>,
steal_cursor: Cell<usize>,
}
impl WorkerRuntime {
pub(crate) fn new(worker_index: usize) -> Self {
let local = Worker::new_fifo();
let queue = Arc::new(WorkerQueue::new(worker_index, local.stealer()));
Self {
queue,
local,
steal_cursor: Cell::new(worker_index.wrapping_add(1)),
}
}
#[inline]
pub(crate) fn worker_index(&self) -> usize {
self.queue.worker_index()
}
pub(crate) fn next_steal_start(&self, queue_count: usize) -> usize {
let current = self.steal_cursor.get();
self.steal_cursor.set(current.wrapping_add(1));
current % queue_count
}
}