use crate::cell::RefCell;
use crate::ptr::null_mut;
use crate::sync::Mutex;
use crate::vec::Vec;
use crate::collections::HashMap;
use crate::sys::freertos::freertos_api;
pub type Key = usize;
static DESTRUCTORS : Mutex<RefCell<
Vec<
Option<unsafe extern "C" fn(*mut u8)>
>
>> = Mutex::new(RefCell::new(Vec::new()));
#[inline]
pub unsafe fn create(dtor: Option<unsafe extern "C" fn(*mut u8)>) -> Key {
let binding = DESTRUCTORS.lock().expect("err");
let mut destructors = binding.borrow_mut();
destructors.push(dtor);
destructors.len()
}
#[inline]
pub unsafe fn set(key: Key, value: *mut u8) {
let list_raw_ptr;
let list : &mut Vec<*mut u8> = unsafe {
list_raw_ptr = freertos_api::rust_std_pvTaskGetThreadLocalStoragePointer (
null_mut(),
0) as *mut Vec<*mut u8>;
&mut *list_raw_ptr
};
let index = key -1;
if index >= list.len() {
list.resize(index + 1, null_mut())
}
list[index] = value;
assert_eq!(list_raw_ptr, list as *mut Vec<*mut u8>);
}
#[inline]
pub unsafe fn get(key: Key) -> *mut u8 {
let list = unsafe {
let list_raw_ptr = freertos_api::rust_std_pvTaskGetThreadLocalStoragePointer (
null_mut(),
0) as *mut Vec<*mut u8>;
&*list_raw_ptr
};
let index = key -1;
if index >= list.len() {
null_mut()
} else {
list[index]
}
}
#[inline]
pub unsafe fn destroy(key: Key) {
let binding = DESTRUCTORS.lock().expect("err");
let destructors = binding.borrow();
let dtor = destructors.get(key).unwrap();
if let Some(_function) = dtor {
}
}