1#![allow(clippy::missing_safety_doc)]
2#![allow(clippy::upper_case_acronyms)]
3
4#[cfg(windows)]
5use unreachable::UncheckedOptionExt; pub use std::ffi::{c_char, c_double, c_int, c_long, c_uchar, c_uint, c_ulong, c_void};
8
9use std::os;
10
11#[allow(non_camel_case_types)]
12pub type size_t = usize;
13
14#[allow(non_camel_case_types)]
17pub type ERL_NIF_UINT = size_t;
18
19#[allow(non_camel_case_types)]
20pub type ERL_NIF_TERM = ERL_NIF_UINT;
21
22#[derive(Debug)]
28#[allow(missing_copy_implementations)]
29#[repr(C)]
30pub struct ErlNifEnv {
31 dummy: *mut c_void, }
33
34unsafe impl Send for ErlNifEnv {}
38
39#[derive(Debug)]
42#[repr(C)]
43pub struct ErlNifFunc {
44 pub name: *const c_char,
45 pub arity: c_uint,
46 pub function: unsafe extern "C" fn(
47 env: *mut ErlNifEnv,
48 argc: c_int,
49 argv: *const ERL_NIF_TERM,
50 ) -> ERL_NIF_TERM,
51 pub flags: c_uint,
52}
53
54#[doc(hidden)]
56#[derive(Debug)]
57#[repr(C)]
58#[allow(non_snake_case)]
59pub struct ErlNifEntry {
60 pub major: c_int,
61 pub minor: c_int,
62 pub name: *const c_char,
63 pub num_of_funcs: c_int,
64 pub funcs: *const ErlNifFunc,
65 pub load: Option<
66 unsafe extern "C" fn(
67 env: *mut ErlNifEnv,
68 priv_data: *mut *mut c_void,
69 load_info: ERL_NIF_TERM,
70 ) -> c_int,
71 >,
72 pub reload: Option<
73 unsafe extern "C" fn(
74 env: *mut ErlNifEnv,
75 priv_data: *mut *mut c_void,
76 load_info: ERL_NIF_TERM,
77 ) -> c_int,
78 >,
79 pub upgrade: Option<
80 unsafe extern "C" fn(
81 env: *mut ErlNifEnv,
82 priv_data: *mut *mut c_void,
83 old_priv_data: *mut *mut c_void,
84 load_info: ERL_NIF_TERM,
85 ) -> c_int,
86 >,
87 pub unload: Option<unsafe extern "C" fn(env: *mut ErlNifEnv, priv_data: *mut c_void) -> ()>,
88 pub vm_variant: *const c_char,
89 pub options: c_uint, pub sizeof_ErlNifResourceTypeInit: usize, }
92
93pub const ERL_NIF_DIRTY_NIF_OPTION: c_uint = 1;
94
95#[allow(missing_copy_implementations)]
97#[derive(Debug, Copy, Clone)]
98#[repr(C)]
99pub struct ErlNifBinary {
100 pub size: size_t,
101 pub data: *mut c_uchar,
102 ref_bin: *mut c_void,
103 _spare: [*mut c_void; 2],
104}
105
106#[cfg(windows)]
107pub type ErlNifEvent = os::windows::raw::HANDLE;
108
109#[cfg(unix)]
110pub type ErlNifEvent = os::unix::io::RawFd;
111
112#[allow(missing_copy_implementations)]
114#[repr(C)]
115pub struct ErlNifResourceType {
116 dummy: c_int,
117}
118
119#[allow(missing_copy_implementations)]
121pub type ErlNifResourceDtor = unsafe extern "C" fn(env: *mut ErlNifEnv, obj: *mut c_void) -> ();
122
123#[allow(missing_copy_implementations)]
125pub type ErlNifResourceStop = unsafe extern "C" fn(
126 env: *mut ErlNifEnv,
127 obj: *mut c_void,
128 event: ErlNifEvent,
129 is_direct_call: c_int,
130) -> ();
131
132#[allow(missing_copy_implementations)]
134pub type ErlNifResourceDown = unsafe extern "C" fn(
135 env: *mut ErlNifEnv,
136 obj: *mut c_void,
137 pid: *const ErlNifPid,
138 mon: *const ErlNifMonitor,
139) -> ();
140
141pub type ErlNifResourceDynCall =
143 unsafe extern "C" fn(env: *mut ErlNifEnv, obj: *mut c_void, call_data: *const c_void) -> ();
144
145#[derive(Debug, Copy, Clone)]
147#[repr(C)]
148pub struct ErlNifResourceTypeInit {
149 pub dtor: *const ErlNifResourceDtor,
150 pub stop: *const ErlNifResourceStop, pub down: *const ErlNifResourceDown, pub members: c_int,
153 pub dyncall: *const ErlNifResourceDynCall,
154}
155
156pub type ErlNifSelectFlags = c_int;
158#[allow(clippy::identity_op)]
159pub const ERL_NIF_SELECT_READ: ErlNifSelectFlags = 1 << 0;
160pub const ERL_NIF_SELECT_WRITE: ErlNifSelectFlags = 1 << 1;
161pub const ERL_NIF_SELECT_STOP: ErlNifSelectFlags = 1 << 2;
162pub const ERL_NIF_SELECT_FAILED: ErlNifSelectFlags = 1 << 3;
163pub const ERL_NIF_SELECT_READ_CANCELLED: ErlNifSelectFlags = 1 << 4;
164pub const ERL_NIF_SELECT_WRITE_CANCELLED: ErlNifSelectFlags = 1 << 5;
165pub const ERL_NIF_SELECT_ERROR_CANCELLED: ErlNifSelectFlags = 1 << 6;
166pub const ERL_NIF_SELECT_NOTSUP: ErlNifSelectFlags = 1 << 7;
167
168#[derive(Debug, Copy, Clone)]
170#[repr(C)]
171pub struct ErlNifMonitor {
172 data: [usize; 4],
175}
176
177#[derive(Debug, Copy, Clone)]
179#[repr(C)]
180pub enum ErlNifResourceFlags {
181 ERL_NIF_RT_CREATE = 1,
182 ERL_NIF_RT_TAKEOVER = 2,
183}
184
185#[derive(Debug, Copy, Clone)]
187#[repr(C)]
188pub enum ErlNifCharEncoding {
189 ERL_NIF_LATIN1 = 1,
190 #[cfg(feature = "nif_version_2_17")]
191 ERL_NIF_UTF8 = 2,
192}
193
194#[derive(Debug, Copy, Clone)]
196#[repr(C)]
197pub struct ErlNifPid {
198 pid: ERL_NIF_TERM,
199}
200
201pub unsafe fn enif_make_pid(_env: *mut ErlNifEnv, pid: ErlNifPid) -> ERL_NIF_TERM {
203 pid.pid
204}
205
206pub unsafe fn enif_compare_pids(pid1: *const ErlNifPid, pid2: *const ErlNifPid) -> c_int {
208 enif_compare((*pid1).pid, (*pid2).pid)
210}
211
212#[allow(missing_copy_implementations)]
214#[repr(C)]
215pub struct ErlNifSysInfo {
216 pub driver_major_version: c_int,
217 pub driver_minor_version: c_int,
218 pub erts_version: *mut c_char,
219 pub otp_release: *mut c_char,
220 pub thread_support: c_int,
221 pub smp_support: c_int,
222 pub async_threads: c_int,
223 pub scheduler_threads: c_int,
224 pub nif_major_version: c_int,
225 pub nif_minor_version: c_int,
226 pub dirty_scheduler_support: c_int,
227}
228
229pub type ErlNifDirtyTaskFlags = c_uint;
238pub const ERL_NIF_DIRTY_JOB_CPU_BOUND: ErlNifDirtyTaskFlags = 1;
239pub const ERL_NIF_DIRTY_JOB_IO_BOUND: ErlNifDirtyTaskFlags = 2;
240
241#[allow(missing_copy_implementations)]
243#[repr(C)]
244pub struct ErlNifMapIterator {
245 map: ERL_NIF_TERM,
246 t_limit: ERL_NIF_UINT,
247 idx: ERL_NIF_UINT,
248 ks: *mut ERL_NIF_TERM,
249 vs: *mut ERL_NIF_TERM,
250 __spare__: [*mut c_void; 2],
251}
252
253#[derive(Copy, Clone)]
255#[repr(C)]
256pub enum ErlNifMapIteratorEntry {
257 ERL_NIF_MAP_ITERATOR_HEAD = 1,
258 ERL_NIF_MAP_ITERATOR_TAIL = 2,
259}
260
261pub type ErlNifTime = i64;
263
264pub const ERL_NIF_TIME_ERROR: i64 = -9_223_372_036_854_775_808;
266#[derive(Copy, Clone)]
270#[repr(C)]
271pub enum ErlNifTimeUnit {
272 ERL_NIF_SEC = 0,
274 ERL_NIF_MSEC = 1,
275 ERL_NIF_USEC = 2,
276 ERL_NIF_NSEC = 3,
277}
278
279pub type ErlNifUniqueInteger = c_int;
281#[allow(clippy::identity_op)]
282pub const ERL_NIF_UNIQUE_POSITIVE: ErlNifUniqueInteger = 1 << 0;
283#[allow(clippy::identity_op)]
284pub const ERL_NIF_UNIQUE_MONOTONIC: ErlNifUniqueInteger = 1 << 1;
285#[derive(Copy, Clone)]
291#[repr(C)]
292pub struct ErlNifPort {
293 port_id: ERL_NIF_TERM, }
295pub type ErlNifBinaryToTerm = c_int;
299pub const ERL_NIF_BIN2TERM_SAFE: ErlNifBinaryToTerm = 0x2000_0000;
300
301pub const ERL_NIF_THR_UNDEFINED: c_int = 0;
302pub const ERL_NIF_THR_NORMAL_SCHEDULER: c_int = 1;
303pub const ERL_NIF_THR_DIRTY_CPU_SCHEDULER: c_int = 2;
304pub const ERL_NIF_THR_DIRTY_IO_SCHEDULER: c_int = 3;
305
306#[derive(Copy, Clone)]
308#[repr(C)]
309pub enum ErlNifHash {
310 ERL_NIF_INTERNAL_HASH = 1,
312 ERL_NIF_PHASH2 = 2,
313}
314
315#[cfg(feature = "nif_version_2_15")]
317#[derive(Copy, Clone)]
318#[repr(C)]
319pub enum ErlNifTermType {
320 ERL_NIF_TERM_TYPE_ATOM = 1,
322 ERL_NIF_TERM_TYPE_BITSTRING = 2,
323 ERL_NIF_TERM_TYPE_FLOAT = 3,
324 ERL_NIF_TERM_TYPE_FUN = 4,
325 ERL_NIF_TERM_TYPE_INTEGER = 5,
326 ERL_NIF_TERM_TYPE_LIST = 6,
327 ERL_NIF_TERM_TYPE_MAP = 7,
328 ERL_NIF_TERM_TYPE_PID = 8,
329 ERL_NIF_TERM_TYPE_PORT = 9,
330 ERL_NIF_TERM_TYPE_REFERENCE = 10,
331 ERL_NIF_TERM_TYPE_TUPLE = 11,
332
333 ERL_NIF_TERM_TYPE__MISSING_DEFAULT_CASE__READ_THE_MANUAL = -1,
338}
339
340#[cfg(feature = "nif_version_2_17")]
342#[derive(Copy, Clone)]
343#[repr(C)]
344pub enum ErlNifOption {
345 ERL_NIF_OPT_DELAY_HALT = 1,
347 ERL_NIF_OPT_ON_HALT = 2,
348}
349
350include!(concat!(env!("OUT_DIR"), "/nif_api.snippet"));
352