use crate::rubysys::{
libc::timeval,
types::{c_int, c_void, Argc, BlockCallFunction, CallbackMutPtr, CallbackPtr, Id, Value},
};
#[cfg(any(unix, windows))]
use crate::rubysys::types::RawFd;
#[cfg_attr(rutie_dllimport, link(name = "rutie_ruby"))]
extern "C" {
pub fn rb_thread_call_without_gvl(
func: CallbackPtr,
args: *const c_void,
unblock_func: CallbackPtr,
unblock_args: *const c_void,
) -> *mut c_void;
pub fn rb_thread_call_without_gvl2(
func: CallbackPtr,
args: *const c_void,
unblock_func: CallbackPtr,
unblock_args: *const c_void,
) -> *mut c_void;
pub fn rb_thread_call_with_gvl(func: CallbackPtr, args: *const c_void) -> *mut c_void;
pub fn rb_thread_create(
function: rutie_callback!(type fn(*mut c_void) -> Value),
data: *mut c_void,
) -> Value;
#[cfg(any(unix, windows))]
pub fn rb_thread_wait_fd(fd: RawFd);
pub fn rb_thread_interrupted(thread: Value) -> c_int;
pub fn rb_fiber_alive_p(fiber: Value) -> Value;
pub fn rb_fiber_current() -> Value;
pub fn rb_fiber_new(func: BlockCallFunction, obj: Value) -> Value;
#[cfg(ruby_gte_3_2)]
pub fn rb_fiber_new_storage(func: BlockCallFunction, obj: Value, storage: Value) -> Value;
pub fn rb_fiber_resume(fiber: Value, argc: Argc, argv: *const Value) -> Value;
pub fn rb_fiber_resume_kw(
fiber: Value,
argc: Argc,
argv: *const Value,
kw_splat: c_int,
) -> Value;
pub fn rb_fiber_yield(argc: Argc, argv: *const Value) -> Value;
pub fn rb_fiber_yield_kw(argc: Argc, argv: *const Value, kw_splat: c_int) -> Value;
pub fn rb_fiber_transfer(fiber: Value, argc: Argc, argv: *const Value) -> Value;
pub fn rb_fiber_transfer_kw(
fiber: Value,
argc: Argc,
argv: *const Value,
kw_splat: c_int,
) -> Value;
pub fn rb_fiber_raise(fiber: Value, argc: Argc, argv: *const Value) -> Value;
pub fn rb_obj_is_fiber(object: Value) -> Value;
pub fn rb_mutex_lock(mutex: Value) -> Value;
pub fn rb_mutex_locked_p(mutex: Value) -> Value;
pub fn rb_mutex_new() -> Value;
pub fn rb_mutex_sleep(mutex: Value, timeout: Value) -> Value;
pub fn rb_mutex_synchronize(
mutex: Value,
func: rutie_callback!(type fn(CallbackMutPtr) -> Value),
arg: CallbackMutPtr,
) -> Value;
pub fn rb_mutex_trylock(mutex: Value) -> Value;
pub fn rb_mutex_unlock(mutex: Value) -> Value;
pub fn rb_thread_alone() -> c_int;
pub fn rb_thread_atfork();
pub fn rb_thread_check_ints();
pub fn rb_thread_current() -> Value;
pub fn rb_thread_fd_writable(fd: c_int) -> c_int;
pub fn rb_thread_kill(thread: Value) -> Value;
pub fn rb_thread_local_aref(thread: Value, name: Id) -> Value;
pub fn rb_thread_local_aset(thread: Value, name: Id, value: Value) -> Value;
pub fn rb_thread_main() -> Value;
pub fn rb_thread_run(thread: Value) -> Value;
pub fn rb_thread_schedule();
pub fn rb_thread_sleep(seconds: c_int);
pub fn rb_thread_sleep_forever();
pub fn rb_thread_wait_for(time: timeval);
pub fn rb_thread_wakeup(thread: Value) -> Value;
}
pub const RUBY_UBF_IO: usize = usize::MAX;
pub const RUBY_UBF_PROCESS: usize = usize::MAX;
#[cfg(ruby_gte_3_2)]
pub const RUBY_INTERNAL_THREAD_EVENT_STARTED: u32 = 1 << 0;
#[cfg(ruby_gte_3_2)]
pub const RUBY_INTERNAL_THREAD_EVENT_READY: u32 = 1 << 1;
#[cfg(ruby_gte_3_2)]
pub const RUBY_INTERNAL_THREAD_EVENT_RESUMED: u32 = 1 << 2;
#[cfg(ruby_gte_3_2)]
pub const RUBY_INTERNAL_THREAD_EVENT_SUSPENDED: u32 = 1 << 3;
#[cfg(ruby_gte_3_2)]
pub const RUBY_INTERNAL_THREAD_EVENT_EXITED: u32 = 1 << 4;
#[cfg(ruby_gte_3_2)]
pub const RUBY_INTERNAL_THREAD_EVENT_MASK: u32 = 0xff;
#[cfg(all(ruby_gte_3_2, not(ruby_gte_3_3)))]
pub type InternalThreadEventData = c_void;
#[cfg(ruby_gte_3_3)]
#[repr(C)]
pub struct InternalThreadEventData {
pub thread: Value,
}
#[cfg(ruby_gte_3_2)]
pub type InternalThreadEventCallback = rutie_callback!(type fn(
event: u32,
event_data: *const InternalThreadEventData,
user_data: *mut c_void,
));
#[cfg(ruby_gte_3_2)]
#[repr(C)]
pub struct InternalThreadEventHook {
_private: [u8; 0],
}
#[cfg(ruby_gte_3_3)]
pub type InternalThreadSpecificKey = c_int;
#[cfg(ruby_gte_3_3)]
pub const RB_INTERNAL_THREAD_SPECIFIC_KEY_MAX: c_int = 8;
#[cfg_attr(rutie_dllimport, link(name = "rutie_ruby"))]
extern "C" {
#[cfg(ruby_gte_3_2)]
pub fn rb_internal_thread_add_event_hook(
func: InternalThreadEventCallback,
events: u32,
data: *mut c_void,
) -> *mut InternalThreadEventHook;
#[cfg(ruby_gte_3_2)]
pub fn rb_internal_thread_remove_event_hook(hook: *mut InternalThreadEventHook) -> bool;
#[cfg(ruby_gte_3_3)]
pub fn rb_internal_thread_specific_key_create() -> InternalThreadSpecificKey;
#[cfg(ruby_gte_3_3)]
pub fn rb_internal_thread_specific_get(
thread: Value,
key: InternalThreadSpecificKey,
) -> *mut c_void;
#[cfg(ruby_gte_3_3)]
pub fn rb_internal_thread_specific_set(
thread: Value,
key: InternalThreadSpecificKey,
data: *mut c_void,
);
}