如何创建静态全局Mutex来计算正在使用的FFI的实例数?

时间:2017-11-15 02:57:48

标签: rust mutex

我试图跟踪我的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();
    }
}

我试图让它安全,但我无法弄清楚如何。 我尝试过的两件事是

  1. static INSTANCES: Mutex<usize> = Mutex::new(0)在这种情况下,我 无法在此处拨打Mutex::new(0)
  2. lazy_static!{ static ref INSTANCES: Mutex<usize> = Mutex::new(0) }在这种情况下,     我无法在结构函数调用中使用INSTANCES

0 个答案:

没有答案