Documentation
// Implem like this https://play.rust-lang.org/?gist=51089b73b42a20bb49b3d92eb1feae74&version=stable&backtrace=0
static mut ComputeBackendList : *mut Mutex<Vec<Box<ComputeBackend>>> = 0 as *mut Mutex<Vec<Box<ComputeBackend>>>;

pub struct BackendManager {

    pub fn init() {
        assert!(ComputeBackendList == 0 as *mut Mutex<Vec<Box<ComputeBackend>>>);
        unsafe {
            ComputeBackendList = Box::into_raw(Box::new(Mutex::new(Vec::<Box<ComputeBackend>>::new())));
        }
        // TODO: OpenCL and CUDA init
    }

    pub fn finalize() {
        assert!(ComputeBackendList != 0 as *mut Mutex<Vec<Box<ComputeBackend>>>);
        let dealoc = unsafe {
            Box::from_raw(ComputeBackendList);
        }
        // TODO: OpenCL and CUDA finalize
    }
}