// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. #![allow(unused_mut)] #![allow(non_camel_case_types)] #![allow(clippy::undocumented_unsafe_blocks)] //! Symbols to be exported are now defined in this JSON file. //! The `#[napi_sym]` macro checks for missing entries and panics. //! //! `./tools/napi/generate_symbols_list.js` is used to generate the LINK `cli/exports.def` on Windows, //! which is also checked into git. //! //! To add a new napi function: //! 1. Place `#[napi_sym]` on top of your implementation. //! 2. Add the function's identifier to this JSON list. //! 3. Finally, run `tools/napi/generate_symbols_list.js` to update `cli/napi/generated_symbol_exports_list_*.def`. pub mod r#async; pub mod env; pub mod js_native_api; pub mod threadsafe_functions; pub mod util; use std::os::raw::c_int; use std::os::raw::c_void; pub type uv_async_t = *mut uv_async; pub type uv_loop_t = *mut c_void; pub type uv_async_cb = extern "C" fn(handle: uv_async_t); use deno_core::futures::channel::mpsc; #[repr(C)] pub struct uv_async { pub data: Option<*mut c_void>, callback: uv_async_cb, sender: Option< mpsc::UnboundedSender, >, ref_sender: Option< mpsc::UnboundedSender, >, } #[no_mangle] pub extern "C" fn uv_default_loop() -> uv_loop_t { std::ptr::null_mut() } /// # Safety /// libuv APIs #[no_mangle] pub unsafe extern "C" fn uv_async_init( _loop: uv_loop_t, async_: uv_async_t, cb: uv_async_cb, ) -> c_int { (*async_).callback = cb; deno_runtime::deno_napi::ASYNC_WORK_SENDER.with(|sender| { (*async_).sender = Some(sender.borrow().clone().unwrap()); }); deno_runtime::deno_napi::THREAD_SAFE_FN_SENDER.with(|sender| { sender .borrow() .clone() .unwrap() .unbounded_send(deno_runtime::deno_napi::ThreadSafeFunctionStatus::Alive) .unwrap(); (*async_).ref_sender = Some(sender.borrow().clone().unwrap()); }); 0 } /// # Safety /// libuv APIs #[no_mangle] pub unsafe extern "C" fn uv_async_send(async_: uv_async_t) -> c_int { let sender = (*async_).sender.as_ref().unwrap(); let fut = Box::new(move || { ((*async_).callback)(async_); }); match sender.unbounded_send(fut) { Ok(_) => 0, Err(_) => 1, } }