expose change_handler to C via FFI

This commit is contained in:
Grant Limberg 2025-08-14 12:43:00 -07:00
commit 3a209e2930

View file

@ -512,7 +512,7 @@ pub unsafe extern "C" fn network_listener_new(
listen_timeout: u64, listen_timeout: u64,
callback: NetworkListenerCallback, callback: NetworkListenerCallback,
user_ptr: *mut c_void, user_ptr: *mut c_void,
) -> *const Arc<NetworkListener> { ) -> *const NetworkListener {
if listen_timeout == 0 { if listen_timeout == 0 {
println!("listen_timeout is zero"); println!("listen_timeout is zero");
return std::ptr::null_mut(); return std::ptr::null_mut();
@ -527,7 +527,7 @@ pub unsafe extern "C" fn network_listener_new(
let rt = runtime::Handle::current(); let rt = runtime::Handle::current();
rt.block_on(async { rt.block_on(async {
match NetworkListener::new(id, Duration::from_secs(listen_timeout), callback, user_ptr).await { match NetworkListener::new(id, Duration::from_secs(listen_timeout), callback, user_ptr).await {
Ok(listener) => Arc::into_raw(Arc::new(listener)), Ok(listener) => Arc::into_raw(listener),
Err(e) => { Err(e) => {
println!("error creating network listener: {}", e); println!("error creating network listener: {}", e);
std::ptr::null_mut() std::ptr::null_mut()
@ -538,7 +538,7 @@ pub unsafe extern "C" fn network_listener_new(
#[cfg(feature = "ztcontroller")] #[cfg(feature = "ztcontroller")]
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn network_listener_delete(ptr: *const Arc<NetworkListener>) { pub unsafe extern "C" fn network_listener_delete(ptr: *const NetworkListener) {
if ptr.is_null() { if ptr.is_null() {
return; return;
} }
@ -547,7 +547,7 @@ pub unsafe extern "C" fn network_listener_delete(ptr: *const Arc<NetworkListener
#[cfg(feature = "ztcontroller")] #[cfg(feature = "ztcontroller")]
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn network_listener_listen(ptr: *const Arc<NetworkListener>) -> bool { pub unsafe extern "C" fn network_listener_listen(ptr: *const NetworkListener) -> bool {
use std::mem::ManuallyDrop; use std::mem::ManuallyDrop;
if ptr.is_null() { if ptr.is_null() {
println!("ptr is null"); println!("ptr is null");
@ -569,6 +569,28 @@ pub unsafe extern "C" fn network_listener_listen(ptr: *const Arc<NetworkListener
} }
} }
#[cfg(feature = "ztcontroller")]
#[no_mangle]
pub unsafe extern "C" fn network_listener_change_handler(ptr: *const NetworkListener) {
use std::mem::ManuallyDrop;
if ptr.is_null() {
println!("ptr is null");
return;
}
let listener = ManuallyDrop::new(unsafe { Arc::from_raw(ptr) });
let rt = runtime::Handle::current();
match rt.block_on(listener.change_handler()) {
Ok(_) => {
println!("Network listener change listener completed successfully");
}
Err(e) => {
println!("Error in network listener change listener: {}", e);
}
}
}
#[cfg(feature = "ztcontroller")] #[cfg(feature = "ztcontroller")]
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn member_listener_new( pub unsafe extern "C" fn member_listener_new(
@ -576,7 +598,7 @@ pub unsafe extern "C" fn member_listener_new(
listen_timeout: u64, listen_timeout: u64,
callback: MemberListenerCallback, callback: MemberListenerCallback,
user_ptr: *mut c_void, user_ptr: *mut c_void,
) -> *const Arc<MemberListener> { ) -> *const MemberListener {
if listen_timeout == 0 { if listen_timeout == 0 {
println!("listen_timeout is zero"); println!("listen_timeout is zero");
return std::ptr::null_mut(); return std::ptr::null_mut();
@ -591,7 +613,7 @@ pub unsafe extern "C" fn member_listener_new(
let rt = runtime::Handle::current(); let rt = runtime::Handle::current();
rt.block_on(async { rt.block_on(async {
match MemberListener::new(id, Duration::from_secs(listen_timeout), callback, user_ptr).await { match MemberListener::new(id, Duration::from_secs(listen_timeout), callback, user_ptr).await {
Ok(listener) => Arc::into_raw(Arc::new(listener)), Ok(listener) => Arc::into_raw(listener),
Err(e) => { Err(e) => {
println!("error creating member listener: {}", e); println!("error creating member listener: {}", e);
std::ptr::null_mut() std::ptr::null_mut()
@ -602,7 +624,7 @@ pub unsafe extern "C" fn member_listener_new(
#[cfg(feature = "ztcontroller")] #[cfg(feature = "ztcontroller")]
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn member_listener_delete(ptr: *const Arc<MemberListener>) { pub unsafe extern "C" fn member_listener_delete(ptr: *const MemberListener) {
if ptr.is_null() { if ptr.is_null() {
return; return;
} }
@ -611,7 +633,7 @@ pub unsafe extern "C" fn member_listener_delete(ptr: *const Arc<MemberListener>)
#[cfg(feature = "ztcontroller")] #[cfg(feature = "ztcontroller")]
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn member_listener_listen(ptr: *const Arc<MemberListener>) -> bool { pub unsafe extern "C" fn member_listener_listen(ptr: *const MemberListener) -> bool {
use std::mem::ManuallyDrop; use std::mem::ManuallyDrop;
if ptr.is_null() { if ptr.is_null() {
println!("ptr is null"); println!("ptr is null");
@ -631,3 +653,25 @@ pub unsafe extern "C" fn member_listener_listen(ptr: *const Arc<MemberListener>)
} }
} }
} }
#[cfg(feature = "ztcontroller")]
#[no_mangle]
pub unsafe extern "C" fn member_listener_change_handler(ptr: *const MemberListener) {
use std::mem::ManuallyDrop;
if ptr.is_null() {
println!("ptr is null");
return;
}
let listener = ManuallyDrop::new(unsafe { Arc::from_raw(ptr) });
let rt = runtime::Handle::current();
match rt.block_on(listener.change_handler()) {
Ok(_) => {
println!("Member listener change listener completed successfully");
}
Err(e) => {
println!("Error in member listener change listener: {}", e);
}
}
}