我试图跟踪我的C包装器的实例数量已经初始化。
我使用std::sync::Once
一次初始化C库,我需要能够在所有实例超出范围后调用terminate
。
目前,我有
static INSTANCES: usize = 0;
static mut VERSION: i32 = 0;
static GPIO_INIT: Once = ONCE_INIT;
fn init_gpio_lib() -> i32 {
println!("GPIOs initialized.");
64
}
fn terminate_gpio_lib() {
println!("GPIO lib terminated!");
}
struct GPIO {
version: i32
}
impl GPIO {
fn init() -> GPIO {
GPIO_INIT.call_once(|| {
unsafe {
VERSION = init_gpio_lib();
}
});
unsafe {
INSTANCES += 1;
}
unsafe {
GPIO {
version: VERSION
}
}
}
fn terminate(&mut self) {
unsafe {
INSTANCES -= 1;
if INSTANCES == 0 {
terminate_gpio_lib();
}
}
}
}
impl Drop for GPIO {
fn drop(&mut self) {
self.terminate();
}
}
我试图让它安全,但我无法弄清楚如何。 我尝试过的两件事是
static INSTANCES: Mutex<usize> = Mutex::new(0)
在这种情况下,我
无法在此处拨打Mutex::new(0)
。 lazy_static!{ static ref INSTANCES: Mutex<usize> = Mutex::new(0) }
在这种情况下,
我无法在结构函数调用中使用INSTANCES
。