diff --git a/handles/Cargo.toml b/handles/Cargo.toml new file mode 100644 index 000000000..947053013 --- /dev/null +++ b/handles/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "cxx-handles-demo" +version = "0.0.0" +authors = ["David Tolnay "] +edition = "2018" +publish = false + +[dependencies] +cxx = "0.5" + +[build-dependencies] +cxx-build = "0.5" + +[workspace] diff --git a/handles/build.rs b/handles/build.rs new file mode 100644 index 000000000..cdaf2d315 --- /dev/null +++ b/handles/build.rs @@ -0,0 +1,5 @@ +fn main() { + cxx_build::bridges(&["src/main.rs", "src/handle.rs"]) + .file("src/test.cc") + .compile("cxx-handles-demo"); +} diff --git a/handles/src/handle.rs b/handles/src/handle.rs new file mode 100644 index 000000000..d2dacd87f --- /dev/null +++ b/handles/src/handle.rs @@ -0,0 +1,10 @@ +#[cxx::bridge(namespace = zx::ffi)] +pub mod ffi { + struct Process { + raw: u32, + } + + struct Job { + raw: u32, + } +} diff --git a/handles/src/main.rs b/handles/src/main.rs new file mode 100644 index 000000000..cdd32f39a --- /dev/null +++ b/handles/src/main.rs @@ -0,0 +1,24 @@ +mod handle; + +use cxx::CxxString; + +#[cxx::bridge(namespace = my_usage::ffi)] +mod ffi { + #[namespace = "zx::ffi"] + extern "C++" { + include!("cxx-handles-demo/src/handle.rs.h"); + type Job = crate::handle::ffi::Job; + type Process = crate::handle::ffi::Process; + } + + extern "Rust" { + fn create_process(name: &CxxString, job: &Job) -> Process; + } +} + +fn create_process(name: &CxxString, job: &handle::ffi::Job) -> handle::ffi::Process { + println!("{:?} job={}", name, job.raw); + handle::ffi::Process { raw: 0 } +} + +fn main() {} diff --git a/handles/src/test.cc b/handles/src/test.cc new file mode 100644 index 000000000..701ab6885 --- /dev/null +++ b/handles/src/test.cc @@ -0,0 +1,5 @@ +#include "cxx-handles-demo/src/main.rs.h" + +void test() { + my_usage::ffi::create_process("name?", zx::ffi::Job{1}); +}