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 { |
23 | pub(super) fn pop<T: 'static>(&mut self) -> Option<task::Notified<T>> { |
24 | let task: RawTask = 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(val:None) }; |
33 | |
34 | // safety: a `Notified` is pushed into the queue and now it is popped! |
35 | Some(unsafe { task::Notified::from_raw(ptr:task) }) |
36 | } |
37 | |
38 | pub(crate) fn is_empty(&self) -> bool { |
39 | self.head.is_none() |
40 | } |
41 | } |
42 | |