Skip to main content

dispatch2/
workloop.rs

1use alloc::ffi::CString;
2use core::{borrow::Borrow, ops::Deref};
3
4use crate::{DispatchQueue, DispatchRetained};
5
6dispatch_object!(
7    /// Dispatch workloop queue.
8    #[doc(alias = "dispatch_workloop_t")]
9    #[doc(alias = "dispatch_workloop_s")]
10    pub struct DispatchWorkloop;
11);
12
13dispatch_object_not_data!(unsafe DispatchWorkloop);
14
15impl DispatchWorkloop {
16    /// Create a new [`DispatchWorkloop`].
17    #[inline]
18    pub fn new(label: &str, inactive: bool) -> DispatchRetained<Self> {
19        let label = CString::new(label).expect("Invalid label!");
20
21        // Safety: label can only be valid.
22        unsafe {
23            if inactive {
24                DispatchWorkloop::__new_inactive(label.as_ptr())
25            } else {
26                DispatchWorkloop::__new(label.as_ptr())
27            }
28        }
29    }
30}
31
32impl Deref for DispatchWorkloop {
33    type Target = DispatchQueue;
34
35    /// Access the workloop as a [`DispatchQueue`].
36    #[inline]
37    fn deref(&self) -> &Self::Target {
38        let ptr: *const DispatchWorkloop = self;
39        let ptr: *const DispatchQueue = ptr.cast();
40        // SAFETY: Workloop queues are "subclasses" of queues (they can be
41        // used in all the same places that normal queues can).
42        unsafe { &*ptr }
43    }
44}
45
46impl AsRef<DispatchQueue> for DispatchWorkloop {
47    #[inline]
48    fn as_ref(&self) -> &DispatchQueue {
49        self
50    }
51}
52
53// PartialEq, Eq and Hash work the same for workloops and queues.
54impl Borrow<DispatchQueue> for DispatchWorkloop {
55    #[inline]
56    fn borrow(&self) -> &DispatchQueue {
57        self
58    }
59}