#![allow(unsafe_code)]
use core::ffi::c_void;
use crate::engine::EngineError;
use crate::panic_guard::FfiBoundary;
use crate::runtime::EngineContext;
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__parallel_scan_init(
ctx: *mut EngineContext,
scan_ctx: *mut *mut c_void,
num_threads: *mut usize,
use_reserved_threads: bool,
max_desired_threads: usize,
) -> i32 {
FfiBoundary::run_default(EngineError::Internal.to_mysql_errno(), || {
let engine = unsafe { &mut *ctx }.engine_mut();
match engine.parallel_scan_init(use_reserved_threads, max_desired_threads) {
Ok(init) => {
if !scan_ctx.is_null() {
unsafe { *scan_ctx = init.scan_ctx() };
}
if !num_threads.is_null() {
unsafe { *num_threads = init.num_threads() };
}
0
}
Err(e) => e.to_mysql_errno(),
}
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__parallel_scan(
ctx: *mut EngineContext,
scan_ctx: *mut c_void,
thread_ctxs: *mut *mut c_void,
init_fn: *const c_void,
load_fn: *const c_void,
end_fn: *const c_void,
) -> i32 {
FfiBoundary::run(|| {
let engine = unsafe { &mut *ctx }.engine_mut();
engine.parallel_scan(scan_ctx, thread_ctxs, init_fn, load_fn, end_fn)
})
}
#[doc(hidden)]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rust__handler__parallel_scan_end(
ctx: *mut EngineContext,
scan_ctx: *mut c_void,
) {
FfiBoundary::run_void(|| {
unsafe { &mut *ctx }
.engine_mut()
.parallel_scan_end(scan_ctx);
});
}