use crate::ffi::{block_on, clear_last_error};
use crate::timer::{DtactInterval, sleep};
use std::time::Duration;
#[unsafe(no_mangle)]
pub unsafe extern "C" fn dtact_util_timer_sleep_ms(millis: u64) {
clear_last_error();
block_on(sleep(Duration::from_millis(millis)));
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn dtact_util_timer_interval_create(
period_millis: u64,
) -> *mut DtactInterval {
clear_last_error();
if period_millis == 0 {
crate::ffi::set_last_error("interval period must be > 0");
return std::ptr::null_mut();
}
Box::into_raw(Box::new(DtactInterval::new(Duration::from_millis(
period_millis,
))))
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn dtact_util_timer_interval_tick(interval: *mut DtactInterval) {
clear_last_error();
if interval.is_null() {
crate::ffi::set_last_error("null interval handle");
return;
}
let interval = unsafe { &mut *interval };
block_on(interval.tick());
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn dtact_util_timer_interval_free(interval: *mut DtactInterval) {
if !interval.is_null() {
drop(unsafe { Box::from_raw(interval) });
}
}