use crate::codec::dco::Rust2DartMessageDco;
use crate::codec::sse::Rust2DartMessageSse;
use crate::codec::Rust2DartMessageTrait;
use crate::misc::atomic::AtomicU64;
use crate::platform_types::{WireSyncRust2DartDco, WireSyncRust2DartSse};
use allo_isolate::{
ffi::{DartCObject, DartPort},
store_dart_post_cobject,
};
use std::ffi::c_void;
use std::sync::atomic::Ordering;
#[no_mangle]
pub unsafe extern "C" fn frb_init_frb_dart_api_dl(data: *mut std::ffi::c_void) -> isize {
#[cfg(feature = "dart-opaque")]
return dart_sys::Dart_InitializeApiDL(data);
#[cfg(not(feature = "dart-opaque"))]
return 0;
}
#[no_mangle]
pub unsafe extern "C" fn frb_free_wire_sync_rust2dart_dco(value: WireSyncRust2DartDco) {
let _ = Rust2DartMessageDco::from_raw_wire_sync(value);
}
#[no_mangle]
pub unsafe extern "C" fn frb_free_wire_sync_rust2dart_sse(value: WireSyncRust2DartSse) {
let _ = Rust2DartMessageSse::from_raw_wire_sync(value);
}
#[no_mangle]
pub unsafe extern "C" fn frb_create_shutdown_callback() -> unsafe extern "C" fn(*mut c_void) {
static ISOLATES_NUM: AtomicU64 = AtomicU64::new(0);
_ = ISOLATES_NUM.fetch_add(1, Ordering::SeqCst);
unsafe extern "C" fn frb_shutdown_callback(_: *mut c_void) {
unsafe extern "C" fn devnull(_: DartPort, _: *mut DartCObject) -> bool {
true
}
let running = ISOLATES_NUM.fetch_sub(1, Ordering::SeqCst);
if running == 1 {
store_dart_post_cobject(devnull);
};
}
frb_shutdown_callback
}