2
0
Эх сурвалжийг харах

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

Grant Limberg 4 долоо хоног өмнө
parent
commit
4fab227c23

+ 1 - 0
rustybits/Cargo.lock

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

+ 3 - 1
rustybits/Cargo.toml

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

+ 14 - 6
rustybits/src/ext.rs

@@ -530,7 +530,8 @@ pub unsafe extern "C" fn network_listener_new(
     let id = unsafe { CStr::from_ptr(controller_id) }.to_str().unwrap();
 
     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 {
             Ok(listener) => Arc::into_raw(listener),
             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 rt = runtime::Handle::current();
-    match rt.block_on(listener.listen()) {
+    let _guard = rt.enter();
+
+    match futures::executor::block_on(listener.listen()) {
         Ok(_) => {
             println!("Network listener started successfully");
             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 rt = runtime::Handle::current();
-    match rt.block_on(listener.change_handler()) {
+    let _guard = rt.enter();
+
+    match futures::executor::block_on(listener.change_handler()) {
         Ok(_) => {
             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 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 {
             Ok(listener) => Arc::into_raw(listener),
             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 rt = runtime::Handle::current();
-    match rt.block_on(listener.listen()) {
+    let _guard = rt.enter();
+    match futures::executor::block_on(listener.listen()) {
         Ok(_) => {
             println!("Member listener started successfully");
             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 rt = runtime::Handle::current();
-    match rt.block_on(listener.change_handler()) {
+    let _guard = rt.enter();
+    match futures::executor::block_on(listener.change_handler()) {
         Ok(_) => {
             println!("Member listener change listener completed successfully");
         }