From 3a209e29301ba69682ed2b89f1788d747891dc01 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Thu, 14 Aug 2025 12:43:00 -0700 Subject: [PATCH] expose change_handler to C via FFI --- rustybits/src/ext.rs | 60 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/rustybits/src/ext.rs b/rustybits/src/ext.rs index 83fb864e6..30ac7652b 100644 --- a/rustybits/src/ext.rs +++ b/rustybits/src/ext.rs @@ -512,7 +512,7 @@ pub unsafe extern "C" fn network_listener_new( listen_timeout: u64, callback: NetworkListenerCallback, user_ptr: *mut c_void, -) -> *const Arc { +) -> *const NetworkListener { if listen_timeout == 0 { println!("listen_timeout is zero"); return std::ptr::null_mut(); @@ -527,7 +527,7 @@ pub unsafe extern "C" fn network_listener_new( let rt = runtime::Handle::current(); rt.block_on(async { 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) => { println!("error creating network listener: {}", e); std::ptr::null_mut() @@ -538,7 +538,7 @@ pub unsafe extern "C" fn network_listener_new( #[cfg(feature = "ztcontroller")] #[no_mangle] -pub unsafe extern "C" fn network_listener_delete(ptr: *const Arc) { +pub unsafe extern "C" fn network_listener_delete(ptr: *const NetworkListener) { if ptr.is_null() { return; } @@ -547,7 +547,7 @@ pub unsafe extern "C" fn network_listener_delete(ptr: *const Arc) -> bool { +pub unsafe extern "C" fn network_listener_listen(ptr: *const NetworkListener) -> bool { use std::mem::ManuallyDrop; if ptr.is_null() { println!("ptr is null"); @@ -569,6 +569,28 @@ pub unsafe extern "C" fn network_listener_listen(ptr: *const Arc { + println!("Network listener change listener completed successfully"); + } + Err(e) => { + println!("Error in network listener change listener: {}", e); + } + } +} + #[cfg(feature = "ztcontroller")] #[no_mangle] pub unsafe extern "C" fn member_listener_new( @@ -576,7 +598,7 @@ pub unsafe extern "C" fn member_listener_new( listen_timeout: u64, callback: MemberListenerCallback, user_ptr: *mut c_void, -) -> *const Arc { +) -> *const MemberListener { if listen_timeout == 0 { println!("listen_timeout is zero"); return std::ptr::null_mut(); @@ -591,7 +613,7 @@ pub unsafe extern "C" fn member_listener_new( let rt = runtime::Handle::current(); rt.block_on(async { 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) => { println!("error creating member listener: {}", e); std::ptr::null_mut() @@ -602,7 +624,7 @@ pub unsafe extern "C" fn member_listener_new( #[cfg(feature = "ztcontroller")] #[no_mangle] -pub unsafe extern "C" fn member_listener_delete(ptr: *const Arc) { +pub unsafe extern "C" fn member_listener_delete(ptr: *const MemberListener) { if ptr.is_null() { return; } @@ -611,7 +633,7 @@ pub unsafe extern "C" fn member_listener_delete(ptr: *const Arc) #[cfg(feature = "ztcontroller")] #[no_mangle] -pub unsafe extern "C" fn member_listener_listen(ptr: *const Arc) -> bool { +pub unsafe extern "C" fn member_listener_listen(ptr: *const MemberListener) -> bool { use std::mem::ManuallyDrop; if ptr.is_null() { println!("ptr is null"); @@ -631,3 +653,25 @@ pub unsafe extern "C" fn member_listener_listen(ptr: *const Arc) } } } + +#[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); + } + } +}