nautilus_common/ffi/timer.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
// -------------------------------------------------------------------------------------------------
// Copyright (C) 2015-2024 Nautech Systems Pty Ltd. All rights reserved.
// https://nautechsystems.io
//
// Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
// You may not use this file except in compliance with the License.
// You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// -------------------------------------------------------------------------------------------------
use std::ffi::c_char;
use nautilus_core::{
ffi::string::{cstr_to_ustr, str_to_cstr},
uuid::UUID4,
};
use crate::timer::{TimeEvent, TimeEventCallback, TimeEventHandlerV2};
#[repr(C)]
#[derive(Clone, Debug)]
/// Legacy time event handler for Cython/FFI inter-operatbility
///
/// TODO: Remove once Cython is deprecated
///
/// `TimeEventHandler` associates a `TimeEvent` with a callback function that is triggered
/// when the event's timestamp is reached.
pub struct TimeEventHandler {
/// The time event.
pub event: TimeEvent,
/// The callable raw pointer.
pub callback_ptr: *mut c_char,
}
impl From<TimeEventHandlerV2> for TimeEventHandler {
fn from(value: TimeEventHandlerV2) -> Self {
Self {
event: value.event,
callback_ptr: match value.callback {
TimeEventCallback::Python(callback) => callback.as_ptr().cast::<c_char>(),
TimeEventCallback::Rust(_) => {
panic!("Legacy time event handler is not supported for Rust callback")
}
},
}
}
}
/// # Safety
///
/// - Assumes `name_ptr` is borrowed from a valid Python UTF-8 `str`.
#[no_mangle]
pub unsafe extern "C" fn time_event_new(
name_ptr: *const c_char,
event_id: UUID4,
ts_event: u64,
ts_init: u64,
) -> TimeEvent {
TimeEvent::new(
cstr_to_ustr(name_ptr),
event_id,
ts_event.into(),
ts_init.into(),
)
}
/// Returns a [`TimeEvent`] as a C string pointer.
#[no_mangle]
pub extern "C" fn time_event_to_cstr(event: &TimeEvent) -> *const c_char {
str_to_cstr(&event.to_string())
}
// This function only exists so that `TimeEventHandler` is included in the definitions
#[no_mangle]
pub const extern "C" fn dummy(v: TimeEventHandler) -> TimeEventHandler {
v
}