xous-core/services/ffi-test/src/lib.rs
bunnie d1a471b51c clean up the ffi-test library for integration to main
checked all licenses, added some comments, etc.
2022-03-08 00:17:16 +08:00

34 lines
No EOL
1.3 KiB
Rust

#![cfg_attr(target_os = "none", no_std)]
pub mod api;
use xous::CID;
/// A test stub for checking FFI integration routines.
pub struct FfiTest {
conn: CID,
}
impl FfiTest {
pub fn new(xns: &xous_names::XousNames) -> Result<Self, xous::Error> {
REFCOUNT.fetch_add(1, Ordering::Relaxed);
let conn = xns.request_connection_blocking(api::SERVER_NAME_FFITEST).expect("Can't connect to FfiTest server");
Ok(FfiTest {
conn
})
}
}
use core::sync::atomic::{AtomicU32, Ordering};
static REFCOUNT: AtomicU32 = AtomicU32::new(0);
impl Drop for FfiTest {
fn drop(&mut self) {
// the connection to the server side must be reference counted, so that multiple instances of this object within
// a single process do not end up de-allocating the CID on other threads before they go out of scope.
// Note to future me: you want this. Don't get rid of it because you think, "nah, nobody will ever make more than one copy of this object".
if REFCOUNT.fetch_sub(1, Ordering::Relaxed) == 1 {
unsafe{xous::disconnect(self.conn).unwrap();}
}
// if there was object-specific state (such as a one-time use server for async callbacks, specific to the object instance),
// de-allocate those items here. They don't need a reference count because they are object-specific
}
}