use arraydeque::ArrayDeque; use spin::{Mutex, MutexGuard}; use std::mem; use std::sync::mpsc::Receiver; use std::sync::Arc; use super::runq::{RunQueue, ToKey}; const INORDER_QUEUE_SIZE: usize = 64; pub struct InnerJob
{ // peer (used by worker to schedule/handle inorder queue), // when the peer is None, the job is complete peer: Option
, pub body: B, } pub struct Job
{
inner: Arc Clone for Job {
fn clone(&self) -> Job {
Job {
inner: self.inner.clone(),
}
}
}
impl Job {
pub fn new(peer: P, body: B) -> Job {
Job {
inner: Arc::new(Mutex::new(InnerJob {
peer: Some(peer),
body,
})),
}
}
}
impl Job {
/// Returns a mutex guard to the inner job if complete
pub fn complete(&self) -> Option {
queue: Mutex InorderQueue {
pub fn send(&self, job: Job ) -> bool {
self.queue.lock().push_back(job).is_ok()
}
pub fn new() -> InorderQueue {
InorderQueue {
queue: Mutex::new(ArrayDeque::new()),
}
}
#[inline(always)]
pub fn handle ,
>(
device: D,
queue: Q,
receiver: Receiver