fix calling into async functions from non-async via the FFI

This commit is contained in:
Grant Limberg 2025-08-14 14:20:34 -07:00
commit 4fab227c23
3 changed files with 18 additions and 7 deletions

1
rustybits/Cargo.lock generated
View file

@ -3101,6 +3101,7 @@ dependencies = [
"base64 0.21.7", "base64 0.21.7",
"bytes", "bytes",
"cbindgen", "cbindgen",
"futures",
"gcloud-gax", "gcloud-gax",
"gcloud-googleapis", "gcloud-googleapis",
"gcloud-pubsub", "gcloud-pubsub",

View file

@ -7,7 +7,7 @@ edition = "2021"
crate-type = ["staticlib", "rlib"] crate-type = ["staticlib", "rlib"]
[features] [features]
default = ["zeroidc"] default = ["zeroidc", "ztcontroller"]
zeroidc = [] zeroidc = []
ztcontroller = [ ztcontroller = [
"dep:serde", "dep:serde",
@ -22,6 +22,7 @@ ztcontroller = [
"dep:gcloud-googleapis", "dep:gcloud-googleapis",
"dep:tokio", "dep:tokio",
"dep:tokio-util", "dep:tokio-util",
"dep:futures",
] ]
[dependencies] [dependencies]
@ -56,6 +57,7 @@ prost = { version = "0.14", optional = true, features = ["derive"] }
prost-types = { version = "0.14", optional = true } prost-types = { version = "0.14", optional = true }
gcloud-gax = { version = "1.2.0", optional = true } gcloud-gax = { version = "1.2.0", optional = true }
gcloud-googleapis = { version = "1.2.0", optional = true } gcloud-googleapis = { version = "1.2.0", optional = true }
futures = { version = "0.3", optional = true }
[dev-dependencies] [dev-dependencies]
testcontainers = { version = "0.24", features = ["blocking"] } testcontainers = { version = "0.24", features = ["blocking"] }

View file

@ -530,7 +530,8 @@ pub unsafe extern "C" fn network_listener_new(
let id = unsafe { CStr::from_ptr(controller_id) }.to_str().unwrap(); let id = unsafe { CStr::from_ptr(controller_id) }.to_str().unwrap();
let rt = runtime::Handle::current(); let rt = runtime::Handle::current();
rt.block_on(async { let _block = rt.enter();
futures::executor::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(listener), Ok(listener) => Arc::into_raw(listener),
Err(e) => { Err(e) => {
@ -562,7 +563,9 @@ pub unsafe extern "C" fn network_listener_listen(ptr: *const NetworkListener) ->
let listener = ManuallyDrop::new(unsafe { Arc::from_raw(ptr) }); let listener = ManuallyDrop::new(unsafe { Arc::from_raw(ptr) });
let rt = runtime::Handle::current(); let rt = runtime::Handle::current();
match rt.block_on(listener.listen()) { let _guard = rt.enter();
match futures::executor::block_on(listener.listen()) {
Ok(_) => { Ok(_) => {
println!("Network listener started successfully"); println!("Network listener started successfully");
true true
@ -586,7 +589,9 @@ pub unsafe extern "C" fn network_listener_change_handler(ptr: *const NetworkList
let listener = ManuallyDrop::new(unsafe { Arc::from_raw(ptr) }); let listener = ManuallyDrop::new(unsafe { Arc::from_raw(ptr) });
let rt = runtime::Handle::current(); let rt = runtime::Handle::current();
match rt.block_on(listener.change_handler()) { let _guard = rt.enter();
match futures::executor::block_on(listener.change_handler()) {
Ok(_) => { Ok(_) => {
println!("Network listener change listener completed successfully"); println!("Network listener change listener completed successfully");
} }
@ -616,7 +621,8 @@ pub unsafe extern "C" fn member_listener_new(
let id = unsafe { CStr::from_ptr(controller_id) }.to_str().unwrap(); let id = unsafe { CStr::from_ptr(controller_id) }.to_str().unwrap();
let rt = runtime::Handle::current(); let rt = runtime::Handle::current();
rt.block_on(async { let _block = rt.enter();
futures::executor::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(listener), Ok(listener) => Arc::into_raw(listener),
Err(e) => { Err(e) => {
@ -647,7 +653,8 @@ pub unsafe extern "C" fn member_listener_listen(ptr: *const MemberListener) -> b
let listener = ManuallyDrop::new(unsafe { Arc::from_raw(ptr) }); let listener = ManuallyDrop::new(unsafe { Arc::from_raw(ptr) });
let rt = runtime::Handle::current(); let rt = runtime::Handle::current();
match rt.block_on(listener.listen()) { let _guard = rt.enter();
match futures::executor::block_on(listener.listen()) {
Ok(_) => { Ok(_) => {
println!("Member listener started successfully"); println!("Member listener started successfully");
true true
@ -671,7 +678,8 @@ pub unsafe extern "C" fn member_listener_change_handler(ptr: *const MemberListen
let listener = ManuallyDrop::new(unsafe { Arc::from_raw(ptr) }); let listener = ManuallyDrop::new(unsafe { Arc::from_raw(ptr) });
let rt = runtime::Handle::current(); let rt = runtime::Handle::current();
match rt.block_on(listener.change_handler()) { let _guard = rt.enter();
match futures::executor::block_on(listener.change_handler()) {
Ok(_) => { Ok(_) => {
println!("Member listener change listener completed successfully"); println!("Member listener change listener completed successfully");
} }