• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #![cfg_attr(
2     any(not(all(tokio_unstable, feature = "full")), target_family = "wasm"),
3     allow(dead_code)
4 )]
5 
6 use crate::runtime::task;
7 
8 pub(crate) struct Synced {
9     /// True if the queue is closed.
10     pub(super) is_closed: bool,
11 
12     /// Linked-list head.
13     pub(super) head: Option<task::RawTask>,
14 
15     /// Linked-list tail.
16     pub(super) tail: Option<task::RawTask>,
17 }
18 
19 unsafe impl Send for Synced {}
20 unsafe impl Sync for Synced {}
21 
22 impl Synced {
pop<T: 'static>(&mut self) -> Option<task::Notified<T>>23     pub(super) fn pop<T: 'static>(&mut self) -> Option<task::Notified<T>> {
24         let task = self.head?;
25 
26         self.head = unsafe { task.get_queue_next() };
27 
28         if self.head.is_none() {
29             self.tail = None;
30         }
31 
32         unsafe { task.set_queue_next(None) };
33 
34         // safety: a `Notified` is pushed into the queue and now it is popped!
35         Some(unsafe { task::Notified::from_raw(task) })
36     }
37 
is_empty(&self) -> bool38     pub(crate) fn is_empty(&self) -> bool {
39         self.head.is_none()
40     }
41 }
42