#![allow(unsafe_code)]
use core::ffi::c_void;
use crate::panic_guard::FfiBoundary;
use crate::runtime::{EngineContext, FfiPtr};
fn report_mv_capacity(
num_keys: *mut u32,
keys_length: *mut u64,
value: Option<(u32, u64)>,
) -> bool {
match value {
Some((keys, bytes)) => {
unsafe {
if !num_keys.is_null() {
*num_keys = keys;
}
if !keys_length.is_null() {
*keys_length = bytes;
}
}
true
}
None => false,
}
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__set_external_table_offload_error(
ctx: *mut EngineContext,
reason: *const u8,
len: usize,
) {
FfiBoundary::run_void(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
if let Ok(reason) = unsafe { FfiPtr::bytes_to_str(reason, len) } {
engine.set_external_table_offload_error(reason);
}
});
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__external_table_offload_error(ctx: *mut EngineContext) {
FfiBoundary::run_void(|| {
unsafe { &mut *ctx }
.engine_mut()
.external_table_offload_error();
});
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__clone(
ctx: *mut EngineContext,
name: *const u8,
len: usize,
mem_root: *mut c_void,
) -> *mut c_void {
FfiBoundary::run_default(core::ptr::null_mut(), || {
let engine = unsafe { &mut *ctx }.engine_mut();
match unsafe { FfiPtr::bytes_to_str(name, len) } {
Ok(name) => engine.clone_handler(name, mem_root),
Err(_) => core::ptr::null_mut(),
}
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__mv_key_capacity(
ctx: *mut EngineContext,
num_keys: *mut u32,
keys_length: *mut u64,
) -> bool {
FfiBoundary::run_default(false, || {
let value = unsafe { &mut *ctx }.engine_mut().mv_key_capacity();
report_mv_capacity(num_keys, keys_length, value)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__get_partition_handler(
ctx: *mut EngineContext,
) -> *mut c_void {
FfiBoundary::run_default(core::ptr::null_mut(), || {
unsafe { &mut *ctx }.engine_mut().get_partition_handler()
})
}
#[cfg(test)]
mod tests {
use super::report_mv_capacity;
#[test]
fn report_mv_capacity_writes_pair_and_signals_handled() {
let (mut n, mut b) = (0, 0);
assert!(report_mv_capacity(&raw mut n, &raw mut b, Some((4, 1024))));
assert_eq!((n, b), (4, 1024));
}
#[test]
fn report_mv_capacity_none_leaves_buffers_and_signals_unhandled() {
let (mut n, mut b) = (7, 9);
assert!(!report_mv_capacity(&raw mut n, &raw mut b, None));
assert_eq!((n, b), (7, 9));
}
#[test]
fn report_mv_capacity_tolerates_null_out_pointers() {
assert!(report_mv_capacity(
core::ptr::null_mut(),
core::ptr::null_mut(),
Some((1, 1))
));
}
}