we can start & stop a thread. so that's nice.

This commit is contained in:
Grant Limberg 2021-10-28 09:29:33 -07:00
parent c689c0bd8c
commit 0069b1bac3
No known key found for this signature in database
GPG Key ID: 2BA62CCABBB4095A
2 changed files with 55 additions and 9 deletions

View File

@ -14,4 +14,4 @@ crate-type = ["staticlib"]
openidconnect = "2.1.0"
[build-dependencies]
cbindgen = "0.20.0"
cbindgen = "0.20.0"

View File

@ -1,22 +1,68 @@
use std::sync::{Arc, Mutex};
use std::thread::{sleep, spawn, JoinHandle};
use std::time::Duration;
#[repr(C)]
pub struct ZeroIDC {}
pub struct ZeroIDC {
inner: Arc<Mutex<Inner>>,
}
struct Inner {
running: bool,
oidc_thread: Option<JoinHandle<()>>,
}
impl ZeroIDC {
fn new() -> ZeroIDC {
ZeroIDC {
inner: Arc::new(Mutex::new(Inner {
running: false,
oidc_thread: None,
})),
}
}
fn start(&mut self) {
let local = Arc::clone(&self.inner);
if !(*local.lock().unwrap()).running {
let inner_local = Arc::clone(&self.inner);
(*local.lock().unwrap()).oidc_thread = Some(spawn(move || {
(*inner_local.lock().unwrap()).running = true;
while (*inner_local.lock().unwrap()).running {
println!("tick");
sleep(Duration::from_secs(1));
}
println!("thread done!")
}));
}
}
fn stop(&mut self) {
let local = self.inner.clone();
if (*local.lock().unwrap()).running {
if let Some(u) = (*local.lock().unwrap()).oidc_thread.take() {
u.join().expect("join failed");
}
}
}
}
#[no_mangle]
pub extern "C" fn zeroidc_new() -> Box<ZeroIDC> {
Box::new(ZeroIDC{})
Box::new(ZeroIDC::new())
}
#[no_mangle]
pub extern "C" fn zeroidc_delete(_: Option<Box<ZeroIDC>>) {}
#[no_mangle]
pub extern "C" fn zeroidc_start(idc: &mut ZeroIDC) {
pub extern "C" fn zeroidc_start(idc: &'static mut ZeroIDC) {
idc.start();
}
#[no_mangle]
pub extern "C" fn zeroidc_stop(idc: &mut ZeroIDC) {
pub extern "C" fn zeroidc_stop(idc: &'static mut ZeroIDC) {
idc.stop();
}