#![allow(clippy::missing_safety_doc)]
#![allow(clippy::upper_case_acronyms)]
pub use std::ffi::{c_char, c_double, c_int, c_long, c_uchar, c_uint, c_ulong, c_void, CStr};
use std::os;
#[allow(non_camel_case_types)]
pub type size_t = usize;
#[allow(non_camel_case_types)]
pub type ERL_NIF_UINT = size_t;
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[repr(transparent)]
pub struct ErlNifTerm(ERL_NIF_UINT);
impl std::fmt::Display for ErlNifTerm {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Debug)]
#[allow(missing_copy_implementations)]
#[repr(C)]
pub struct ErlNifEnv {
dummy: *mut c_void, }
unsafe impl Send for ErlNifEnv {}
#[derive(Debug)]
#[repr(C)]
pub struct ErlNifFunc {
pub name: *const c_char,
pub arity: c_uint,
pub function: unsafe extern "C" fn(
env: *mut ErlNifEnv,
argc: c_int,
argv: *const ErlNifTerm,
) -> ErlNifTerm,
pub flags: c_uint,
}
type LoadFun = unsafe extern "C" fn(
env: *mut ErlNifEnv,
priv_data: *mut *mut c_void,
load_info: ErlNifTerm,
) -> c_int;
type UpgradeFun = unsafe extern "C" fn(
env: *mut ErlNifEnv,
priv_data: *mut *mut c_void,
old_priv_data: *mut *mut c_void,
load_info: ErlNifTerm,
) -> c_int;
type UnloadFun = unsafe extern "C" fn(env: *mut ErlNifEnv, priv_data: *mut c_void) -> ();
#[doc(hidden)]
#[derive(Debug)]
#[repr(C)]
#[allow(non_snake_case)]
pub struct ErlNifEntry {
pub major: c_int,
pub minor: c_int,
pub name: *const c_char,
pub num_of_funcs: c_int,
pub funcs: *const ErlNifFunc,
pub load: Option<LoadFun>,
pub reload: Option<LoadFun>,
pub upgrade: Option<UpgradeFun>,
pub unload: Option<UnloadFun>,
pub vm_variant: *const c_char,
pub options: c_uint, pub sizeof_ErlNifResourceTypeInit: usize, pub min_erts: *const c_char, }
impl ErlNifEntry {
pub const fn new(name: &CStr, nif_funcs: &[ErlNifFunc], load: LoadFun) -> Self {
let min_erts = if cfg!(feature = "nif_version_2_18") {
c"OTP-29.0"
} else if cfg!(feature = "nif_version_2_17") {
c"OTP-26.0"
} else if cfg!(feature = "nif_version_2_16") {
c"OTP-24.0"
} else if cfg!(feature = "nif_version_2_15") {
c"OTP-22.0"
} else {
c"OTP-21.0"
};
Self {
major: super::NIF_MAJOR_VERSION,
minor: super::NIF_MINOR_VERSION,
name: name.as_ptr(),
num_of_funcs: nif_funcs.len() as c_int,
funcs: nif_funcs.as_ptr(),
load: Some(load),
reload: None,
upgrade: None,
unload: None,
vm_variant: c"beam.vanilla".as_ptr(),
options: 0,
sizeof_ErlNifResourceTypeInit: std::mem::size_of::<ErlNifResourceTypeInit>(),
min_erts: min_erts.as_ptr(),
}
}
}
pub const ERL_NIF_DIRTY_NIF_OPTION: c_uint = 1;
#[allow(missing_copy_implementations)]
#[derive(Debug, Copy, Clone)]
#[repr(C)]
pub struct ErlNifBinary {
pub size: size_t,
pub data: *mut c_uchar,
ref_bin: *mut c_void,
_spare: [*mut c_void; 2],
}
#[cfg(windows)]
pub type ErlNifEvent = os::windows::raw::HANDLE;
#[cfg(unix)]
pub type ErlNifEvent = os::unix::io::RawFd;
#[allow(missing_copy_implementations)]
#[repr(C)]
pub struct ErlNifResourceType {
dummy: c_int,
}
#[allow(missing_copy_implementations)]
pub type ErlNifResourceDtor = unsafe extern "C" fn(env: *mut ErlNifEnv, obj: *mut c_void) -> ();
#[allow(missing_copy_implementations)]
pub type ErlNifResourceStop = unsafe extern "C" fn(
env: *mut ErlNifEnv,
obj: *mut c_void,
event: ErlNifEvent,
is_direct_call: c_int,
) -> ();
#[allow(missing_copy_implementations)]
pub type ErlNifResourceDown = unsafe extern "C" fn(
env: *mut ErlNifEnv,
obj: *mut c_void,
pid: *const ErlNifPid,
mon: *const ErlNifMonitor,
) -> ();
pub type ErlNifResourceDynCall =
unsafe extern "C" fn(env: *mut ErlNifEnv, obj: *mut c_void, call_data: *const c_void) -> ();
#[derive(Debug, Copy, Clone)]
#[repr(C)]
pub struct ErlNifResourceTypeInit {
pub dtor: *const ErlNifResourceDtor,
pub stop: *const ErlNifResourceStop, pub down: *const ErlNifResourceDown,
#[cfg(feature = "nif_version_2_16")]
pub members: c_int,
#[cfg(feature = "nif_version_2_16")]
pub dyncall: *const ErlNifResourceDynCall,
}
pub type ErlNifSelectFlags = c_int;
#[allow(clippy::identity_op)]
pub const ERL_NIF_SELECT_READ: ErlNifSelectFlags = 1 << 0;
pub const ERL_NIF_SELECT_WRITE: ErlNifSelectFlags = 1 << 1;
pub const ERL_NIF_SELECT_STOP: ErlNifSelectFlags = 1 << 2;
pub const ERL_NIF_SELECT_FAILED: ErlNifSelectFlags = 1 << 3;
pub const ERL_NIF_SELECT_READ_CANCELLED: ErlNifSelectFlags = 1 << 4;
pub const ERL_NIF_SELECT_WRITE_CANCELLED: ErlNifSelectFlags = 1 << 5;
pub const ERL_NIF_SELECT_ERROR_CANCELLED: ErlNifSelectFlags = 1 << 6;
pub const ERL_NIF_SELECT_NOTSUP: ErlNifSelectFlags = 1 << 7;
#[derive(Debug, Copy, Clone)]
#[repr(C)]
pub struct ErlNifMonitor {
data: [usize; 4],
}
#[derive(Debug, Copy, Clone)]
#[repr(C)]
pub enum ErlNifResourceFlags {
ERL_NIF_RT_CREATE = 1,
ERL_NIF_RT_TAKEOVER = 2,
}
#[derive(Debug, Copy, Clone)]
#[repr(C)]
pub enum ErlNifCharEncoding {
ERL_NIF_LATIN1 = 1,
#[cfg(feature = "nif_version_2_17")]
ERL_NIF_UTF8 = 2,
}
#[derive(Debug, Copy, Clone)]
#[repr(C)]
pub struct ErlNifPid {
pub(crate) pid: ErlNifTerm,
}
#[allow(missing_copy_implementations)]
#[repr(C)]
pub struct ErlNifSysInfo {
pub driver_major_version: c_int,
pub driver_minor_version: c_int,
pub erts_version: *mut c_char,
pub otp_release: *mut c_char,
pub thread_support: c_int,
pub smp_support: c_int,
pub async_threads: c_int,
pub scheduler_threads: c_int,
pub nif_major_version: c_int,
pub nif_minor_version: c_int,
pub dirty_scheduler_support: c_int,
}
pub type ErlNifDirtyTaskFlags = c_uint;
pub const ERL_NIF_NORMAL_JOB: ErlNifDirtyTaskFlags = 0;
pub const ERL_NIF_DIRTY_JOB_CPU_BOUND: ErlNifDirtyTaskFlags = 1;
pub const ERL_NIF_DIRTY_JOB_IO_BOUND: ErlNifDirtyTaskFlags = 2;
#[allow(missing_copy_implementations)]
#[repr(C)]
pub struct ErlNifMapIterator {
map: ErlNifTerm,
t_limit: ERL_NIF_UINT,
idx: ERL_NIF_UINT,
ks: *mut ErlNifTerm,
vs: *mut ErlNifTerm,
__spare__: [*mut c_void; 2],
}
#[derive(Copy, Clone)]
#[repr(C)]
pub enum ErlNifMapIteratorEntry {
ERL_NIF_MAP_ITERATOR_HEAD = 1,
ERL_NIF_MAP_ITERATOR_TAIL = 2,
}
pub type ErlNifTime = i64;
pub const ERL_NIF_TIME_ERROR: i64 = i64::MIN;
#[derive(Copy, Clone)]
#[repr(C)]
pub enum ErlNifTimeUnit {
ERL_NIF_SEC = 0,
ERL_NIF_MSEC = 1,
ERL_NIF_USEC = 2,
ERL_NIF_NSEC = 3,
}
pub type ErlNifUniqueInteger = c_int;
#[allow(clippy::identity_op)]
pub const ERL_NIF_UNIQUE_POSITIVE: ErlNifUniqueInteger = 1 << 0;
#[allow(clippy::identity_op)]
pub const ERL_NIF_UNIQUE_MONOTONIC: ErlNifUniqueInteger = 1 << 1;
#[derive(Copy, Clone)]
#[repr(C)]
pub struct ErlNifPort {
port_id: ErlNifTerm, }
pub type ErlNifBinaryToTerm = c_uint;
pub const ERL_NIF_BIN2TERM_SAFE: ErlNifBinaryToTerm = 0x2000_0000;
pub const ERL_NIF_THR_UNDEFINED: c_int = 0;
pub const ERL_NIF_THR_NORMAL_SCHEDULER: c_int = 1;
pub const ERL_NIF_THR_DIRTY_CPU_SCHEDULER: c_int = 2;
pub const ERL_NIF_THR_DIRTY_IO_SCHEDULER: c_int = 3;
#[derive(Copy, Clone)]
#[repr(C)]
pub enum ErlNifHash {
ERL_NIF_INTERNAL_HASH = 1,
ERL_NIF_PHASH2 = 2,
}
#[cfg(feature = "nif_version_2_15")]
#[derive(Copy, Clone)]
#[repr(C)]
pub enum ErlNifTermType {
ERL_NIF_TERM_TYPE_ATOM = 1,
ERL_NIF_TERM_TYPE_BITSTRING = 2,
ERL_NIF_TERM_TYPE_FLOAT = 3,
ERL_NIF_TERM_TYPE_FUN = 4,
ERL_NIF_TERM_TYPE_INTEGER = 5,
ERL_NIF_TERM_TYPE_LIST = 6,
ERL_NIF_TERM_TYPE_MAP = 7,
ERL_NIF_TERM_TYPE_PID = 8,
ERL_NIF_TERM_TYPE_PORT = 9,
ERL_NIF_TERM_TYPE_REFERENCE = 10,
ERL_NIF_TERM_TYPE_TUPLE = 11,
ERL_NIF_TERM_TYPE__MISSING_DEFAULT_CASE__READ_THE_MANUAL = -1,
}
#[cfg(feature = "nif_version_2_17")]
#[derive(Copy, Clone)]
#[repr(C)]
pub enum ErlNifOption {
ERL_NIF_OPT_DELAY_HALT = 1,
ERL_NIF_OPT_ON_HALT = 2,
}
const ERL_NIF_IOVEC_SIZE: usize = 16;
pub type SysIOVec = std::io::IoSliceMut<'static>;
const ERTS_SMALL_IO_QUEUE: usize = 5;
#[repr(C)]
pub struct ErlNifIOQueue {
alct: c_int,
driver: c_int,
size: c_uint,
v_start: *mut SysIOVec,
v_end: *mut SysIOVec,
v_head: *mut SysIOVec,
v_tail: *mut SysIOVec,
v_small: [SysIOVec; ERTS_SMALL_IO_QUEUE],
b_start: *mut *mut ErlNifBinary,
b_end: *mut *mut ErlNifBinary,
b_head: *mut *mut ErlNifBinary,
b_tail: *mut *mut ErlNifBinary,
b_small: [*mut ErlNifBinary; ERTS_SMALL_IO_QUEUE],
}
#[repr(C)]
pub struct ErlNifIOVec {
iovcnt: c_int,
size: usize,
iov: *mut SysIOVec,
ref_bins: *mut *mut c_void,
flags: c_int,
small_iov: [SysIOVec; ERL_NIF_IOVEC_SIZE],
small_ref_bin: [*mut c_void; ERL_NIF_IOVEC_SIZE],
}
#[repr(C)]
pub enum ErlNifIOQueueOpts {
ERL_NIF_IOQ_NORMAL = 1,
}