diff --git a/loaded/Cargo.lock b/loaded/Cargo.lock index f2c96d0..66603fc 100644 --- a/loaded/Cargo.lock +++ b/loaded/Cargo.lock @@ -2,6 +2,167 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "libc" +version = "0.2.168" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" + [[package]] name = "loaded" version = "0.1.0" +dependencies = [ + "tokio", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "miniz_oxide" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +dependencies = [ + "adler2", +] + +[[package]] +name = "object" +version = "0.36.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +dependencies = [ + "memchr", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "tokio" +version = "1.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +dependencies = [ + "backtrace", + "pin-project-lite", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/loaded/Cargo.toml b/loaded/Cargo.toml index 9e6b57c..520f18a 100644 --- a/loaded/Cargo.toml +++ b/loaded/Cargo.toml @@ -7,3 +7,4 @@ version = "0.1.0" edition = "2021" [dependencies] +tokio = { version = "1.42.0", features = ["sync", "time"] } diff --git a/loaded/src/lib.rs b/loaded/src/lib.rs index f463fd7..9d64e9d 100644 --- a/loaded/src/lib.rs +++ b/loaded/src/lib.rs @@ -1,12 +1,15 @@ -use std::{future::Future, pin::Pin}; +use std::{future::Future, pin::Pin, time::Duration}; -pub async fn add(left: u64, right: u64) -> u64 { - left + right +use tokio::sync::oneshot::Receiver; + + +pub async fn add(left: u64, right: u64, under: Receiver) -> u64 { + left + right + under.await.unwrap() } #[no_mangle] -pub fn add_wrapper(left: u64, right: u64) -> Pin>> { - Box::pin(add(left,right)) +pub fn add_wrapper(left: u64, right: u64, under: Receiver) -> Pin + Send >> { + Box::pin(add(left,right, under)) } #[cfg(test)] diff --git a/loader/Cargo.toml b/loader/Cargo.toml index 635758b..e6dcbde 100644 --- a/loader/Cargo.toml +++ b/loader/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] anyhow = "1.0.94" libloading = "0.8.6" -tokio = { version = "1.42.0", features = ["full"] } +tokio = { version = "1.42.0", features = ["full", "sync"] } diff --git a/loader/src/main.rs b/loader/src/main.rs index 2683925..b7eae1c 100644 --- a/loader/src/main.rs +++ b/loader/src/main.rs @@ -2,16 +2,25 @@ use std::{future::Future, pin::Pin}; use anyhow::Result; use libloading::{Library, Symbol}; +use tokio::sync::oneshot::{self, Receiver}; #[tokio::main] async fn main() -> Result<()> { let lib = unsafe {Library::new("../loaded/target/release/libloaded.so")?}; - let func: Symbol Pin>>> = unsafe {lib.get(b"add_wrapper")?}; + let (tx,rx) = oneshot::channel(); - let fut = unsafe{func(12,54)}; - let out = (fut).await; + let func: Symbol) -> Pin + Send>>> = unsafe {lib.get(b"add_wrapper")?}; + let func = unsafe{func.into_raw()}; + let fut = unsafe{func(12,54, rx)}; + let out = tokio::spawn(async move { + fut.await + }); + + tx.send(8).unwrap(); + + let out = out.await.unwrap(); println!("returned {out}"); Ok(())