artiq-zynq/src/runtime/src/kernel/cache.rs

31 lines
1.0 KiB
Rust
Raw Normal View History

2022-03-10 16:09:19 +08:00
use alloc::{string::String, boxed::Box};
2020-07-25 17:04:40 +08:00
use cslice::{CSlice, AsCSlice};
use core::mem::{transmute, forget};
use super::{KERNEL_CHANNEL_0TO1, KERNEL_CHANNEL_1TO0, Message};
2020-07-25 17:04:40 +08:00
2022-03-10 16:09:19 +08:00
pub extern fn get(key: CSlice<u8>) -> &CSlice<'static, i32> {
let key = String::from_utf8(key.as_ref().to_vec()).unwrap();
unsafe {
KERNEL_CHANNEL_1TO0.as_mut().unwrap().send(Message::CacheGetRequest(key));
let msg = KERNEL_CHANNEL_0TO1.as_mut().unwrap().recv();
if let Message::CacheGetReply(v) = msg {
2022-03-10 16:09:19 +08:00
let leaked = Box::new(v.as_c_slice());
let reference = transmute(leaked.as_ref());
forget(leaked);
forget(v);
2022-03-10 16:09:19 +08:00
reference
} else {
panic!("Expected CacheGetReply for CacheGetRequest");
}
2020-07-25 17:04:40 +08:00
}
}
2022-03-10 16:09:19 +08:00
pub extern fn put(key: CSlice<u8>, list: &CSlice<i32>) {
let key = String::from_utf8(key.as_ref().to_vec()).unwrap();
let value = list.as_ref().to_vec();
unsafe {
KERNEL_CHANNEL_1TO0.as_mut().unwrap().send(Message::CachePutRequest(key, value));
}
2020-07-25 17:04:40 +08:00
}