#![allow(unsafe_code)]
use super::report::{report_bool, report_u64};
use crate::panic_guard::FfiBoundary;
use crate::runtime::EngineContext;
fn report_auto_increment(
first_value: *mut u64,
nb_reserved: *mut u64,
value: Option<(u64, u64)>,
) -> bool {
match value {
Some((first, reserved)) => {
unsafe {
if !first_value.is_null() {
*first_value = first;
}
if !nb_reserved.is_null() {
*nb_reserved = reserved;
}
}
true
}
None => false,
}
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__start_read_removal(
ctx: *mut EngineContext,
out: *mut bool,
) -> bool {
FfiBoundary::run_default(false, || {
report_bool(out, unsafe { &mut *ctx }.engine_mut().start_read_removal())
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__end_read_removal(
ctx: *mut EngineContext,
out: *mut u64,
) -> bool {
FfiBoundary::run_default(false, || {
report_u64(out, unsafe { &mut *ctx }.engine_mut().end_read_removal())
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__get_auto_increment(
ctx: *mut EngineContext,
offset: u64,
increment: u64,
nb_desired: u64,
first_value: *mut u64,
nb_reserved: *mut u64,
) -> bool {
FfiBoundary::run_default(false, || {
let value = unsafe { &mut *ctx }
.engine_mut()
.get_auto_increment(offset, increment, nb_desired);
report_auto_increment(first_value, nb_reserved, value)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__release_auto_increment(ctx: *mut EngineContext) {
FfiBoundary::run_void(|| {
unsafe { &mut *ctx }.engine_mut().release_auto_increment();
});
}
#[cfg(test)]
mod tests {
use super::report_auto_increment;
#[test]
fn report_auto_increment_writes_block_and_signals_handled() {
let (mut first, mut reserved) = (0, 0);
assert!(report_auto_increment(
&raw mut first,
&raw mut reserved,
Some((10, 5))
));
assert_eq!((first, reserved), (10, 5));
}
#[test]
fn report_auto_increment_none_leaves_buffers_and_signals_unhandled() {
let (mut first, mut reserved) = (7, 9);
assert!(!report_auto_increment(
&raw mut first,
&raw mut reserved,
None
));
assert_eq!((first, reserved), (7, 9));
}
#[test]
fn report_auto_increment_tolerates_null_out_pointers() {
let null = core::ptr::null_mut();
assert!(report_auto_increment(null, null, Some((1, 1))));
}
}