use super::job_queue::*;
use super::queue_state::*;
use std::sync::*;
use std::thread::{Thread};
use futures::task::{ArcWake};
pub (super) struct WakeThread(pub (super) Arc<JobQueue>, pub (super) Thread);
impl ArcWake for WakeThread {
fn wake_by_ref(arc_self: &Arc<Self>) {
let WakeThread(ref queue, ref thread) = **arc_self;
{
let mut queue_core = queue.core.lock().unwrap();
match queue_core.state {
QueueState::WaitingForWake => queue_core.state = QueueState::Idle,
QueueState::WaitingForUnpark => queue_core.state = QueueState::Running,
QueueState::Running => queue_core.state = QueueState::AwokenWhileRunning,
other_state => queue_core.state = other_state
}
}
thread.unpark();
}
}