actix_server/
waker_queue.rs1use std::{
2 collections::VecDeque,
3 ops::Deref,
4 sync::{Arc, Mutex, MutexGuard},
5};
6
7use mio::{Registry, Token as MioToken, Waker};
8
9use crate::worker::WorkerHandleAccept;
10
11pub(crate) const WAKER_TOKEN: MioToken = MioToken(usize::MAX);
13
14pub(crate) struct WakerQueue(Arc<(Waker, Mutex<VecDeque<WakerInterest>>)>);
17
18impl Clone for WakerQueue {
19 fn clone(&self) -> Self {
20 Self(self.0.clone())
21 }
22}
23
24impl Deref for WakerQueue {
25 type Target = (Waker, Mutex<VecDeque<WakerInterest>>);
26
27 fn deref(&self) -> &Self::Target {
28 self.0.deref()
29 }
30}
31
32impl WakerQueue {
33 pub(crate) fn new(registry: &Registry) -> std::io::Result<Self> {
38 let waker = Waker::new(registry, WAKER_TOKEN)?;
39 let queue = Mutex::new(VecDeque::with_capacity(16));
40
41 Ok(Self(Arc::new((waker, queue))))
42 }
43
44 pub(crate) fn wake(&self, interest: WakerInterest) {
46 let (waker, queue) = self.deref();
47
48 queue
49 .lock()
50 .expect("Failed to lock WakerQueue")
51 .push_back(interest);
52
53 waker
54 .wake()
55 .unwrap_or_else(|e| panic!("can not wake up Accept Poll: {}", e));
56 }
57
58 pub(crate) fn guard(&self) -> MutexGuard<'_, VecDeque<WakerInterest>> {
60 self.deref().1.lock().expect("Failed to lock WakerQueue")
61 }
62
63 pub(crate) fn reset(queue: &mut VecDeque<WakerInterest>) {
65 std::mem::swap(&mut VecDeque::<WakerInterest>::with_capacity(16), queue);
66 }
67}
68
69pub(crate) enum WakerInterest {
73 WorkerAvailable(usize),
76 Pause,
79 Resume,
80 Stop,
81 Worker(WorkerHandleAccept),
84}