fruity__bbqsrc/dispatch/
sys.rs

1//! Raw unsafe C functions exposed by libdispatch.
2
3use super::{
4    DispatchObject, DispatchQosClass, DispatchQueue, DispatchSource, DispatchSourceType,
5    DispatchTime,
6};
7use std::os::raw::{c_char, c_int, c_long, c_ulong, c_void};
8
9// Dispatch is reexported by libSystem on Apple platforms.
10#[cfg_attr(target_vendor = "apple", link(name = "System", kind = "dylib"))]
11#[cfg_attr(not(target_vendor = "apple"), link(name = "dispatch", kind = "dylib"))]
12#[allow(missing_docs)]
13extern "C" {
14    pub static _dispatch_main_q: DispatchQueue;
15
16    pub fn dispatch_retain(obj: *const DispatchObject);
17    pub fn dispatch_release(obj: *const DispatchObject);
18
19    pub fn dispatch_activate(obj: *const DispatchObject);
20    pub fn dispatch_resume(obj: *const DispatchObject);
21    pub fn dispatch_suspend(obj: *const DispatchObject);
22
23    pub fn dispatch_get_context(obj: *const DispatchObject) -> *mut c_void;
24    pub fn dispatch_set_context(obj: *const DispatchObject, context: *mut c_void);
25
26    pub fn dispatch_set_target_queue(obj: *const DispatchObject, queue: *const DispatchQueue);
27    pub fn dispatch_get_global_queue(identifier: c_long, flags: c_ulong) -> *const DispatchQueue;
28    pub fn dispatch_queue_get_label(queue: *const DispatchQueue) -> *const c_char;
29    pub fn dispatch_queue_get_qos_class(
30        queue: *const DispatchQueue,
31        relative_priority_ptr: *mut c_int,
32    ) -> DispatchQosClass;
33
34    pub fn dispatch_async_f(
35        queue: *const DispatchQueue,
36        ctx: *mut c_void,
37        work: unsafe extern "C" fn(ctx: *mut c_void),
38    );
39    pub fn dispatch_sync_f(
40        queue: *const DispatchQueue,
41        ctx: *mut c_void,
42        work: unsafe extern "C" fn(ctx: *mut c_void),
43    );
44    pub fn dispatch_apply_f(
45        iterations: usize,
46        queue: *const DispatchQueue,
47        ctx: *mut c_void,
48        work: unsafe extern "C" fn(ctx: *mut c_void, iteration: usize),
49    );
50
51    pub fn dispatch_time(when: DispatchTime, delta: i64) -> DispatchTime;
52
53    #[doc(alias = "DISPATCH_SOURCE_TYPE_ADD")]
54    pub static _dispatch_source_type_data_add: DispatchSourceType;
55
56    #[doc(alias = "DISPATCH_SOURCE_TYPE_OR")]
57    pub static _dispatch_source_type_data_or: DispatchSourceType;
58
59    #[doc(alias = "DISPATCH_SOURCE_TYPE_REPLACE")]
60    pub static _dispatch_source_type_data_replace: DispatchSourceType;
61
62    #[doc(alias = "DISPATCH_SOURCE_TYPE_MACH_SEND")]
63    pub static _dispatch_source_type_mach_send: DispatchSourceType;
64
65    #[doc(alias = "DISPATCH_SOURCE_TYPE_MACH_RECV")]
66    pub static _dispatch_source_type_mach_recv: DispatchSourceType;
67
68    #[doc(alias = "DISPATCH_SOURCE_TYPE_MEMORYPRESSURE")]
69    pub static _dispatch_source_type_memorypressure: DispatchSourceType;
70
71    #[doc(alias = "DISPATCH_SOURCE_TYPE_PROC")]
72    pub static _dispatch_source_type_proc: DispatchSourceType;
73
74    #[doc(alias = "DISPATCH_SOURCE_TYPE_READ")]
75    pub static _dispatch_source_type_read: DispatchSourceType;
76
77    #[doc(alias = "DISPATCH_SOURCE_TYPE_SIGNAL")]
78    pub static _dispatch_source_type_signal: DispatchSourceType;
79
80    #[doc(alias = "DISPATCH_SOURCE_TYPE_TIMER")]
81    pub static _dispatch_source_type_timer: DispatchSourceType;
82
83    #[doc(alias = "DISPATCH_SOURCE_TYPE_VNODE")]
84    pub static _dispatch_source_type_vnode: DispatchSourceType;
85
86    #[doc(alias = "DISPATCH_SOURCE_TYPE_WRITE")]
87    pub static _dispatch_source_type_write: DispatchSourceType;
88
89    pub fn dispatch_source_create(
90        type_: *const DispatchSourceType,
91        handle: usize,
92        mask: usize,
93        queue: *const DispatchQueue,
94    ) -> *const DispatchSource;
95
96    pub fn dispatch_source_cancel(source: *const DispatchSource);
97    pub fn dispatch_source_testcancel(source: *const DispatchSource) -> isize;
98
99    pub fn dispatch_source_get_data(source: *const DispatchSource) -> usize;
100    pub fn dispatch_source_get_mask(source: *const DispatchSource) -> usize;
101    pub fn dispatch_source_get_handle(source: *const DispatchSource) -> usize;
102    pub fn dispatch_source_merge_data(source: *const DispatchSource, value: usize);
103
104    pub fn dispatch_source_set_timer(
105        source: *const DispatchSource,
106        start: DispatchTime,
107        interval: u64,
108        leeway: u64,
109    );
110
111    // TODO: Create safe wrapper methods for these functions.
112    pub fn dispatch_source_set_registration_handler_f(
113        source: *const DispatchSource,
114        handler: Option<unsafe extern "C" fn(ctx: *mut c_void)>,
115    );
116    pub fn dispatch_source_set_event_handler_f(
117        source: *const DispatchSource,
118        handler: unsafe extern "C" fn(ctx: *mut c_void),
119    );
120    pub fn dispatch_source_set_cancel_handler_f(
121        source: *const DispatchSource,
122        handler: Option<unsafe extern "C" fn(ctx: *mut c_void)>,
123    );
124}