2023-02-22 11:02:43 +08:00
|
|
|
use alloc::{boxed::Box, string::String};
|
|
|
|
use core::mem::{forget, transmute};
|
2020-07-25 17:04:40 +08:00
|
|
|
|
2023-02-22 11:02:43 +08:00
|
|
|
use cslice::{AsCSlice, CSlice};
|
|
|
|
|
|
|
|
use super::{Message, KERNEL_CHANNEL_0TO1, KERNEL_CHANNEL_1TO0};
|
|
|
|
|
|
|
|
pub extern "C" fn get(key: CSlice<u8>) -> &CSlice<'static, i32> {
|
2020-08-05 12:25:48 +08:00
|
|
|
let key = String::from_utf8(key.as_ref().to_vec()).unwrap();
|
2020-08-24 16:18:31 +08:00
|
|
|
unsafe {
|
2023-02-22 11:02:43 +08:00
|
|
|
KERNEL_CHANNEL_1TO0
|
|
|
|
.as_mut()
|
|
|
|
.unwrap()
|
|
|
|
.send(Message::CacheGetRequest(key));
|
2020-08-24 16:18:31 +08:00
|
|
|
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);
|
2020-08-24 16:18:31 +08:00
|
|
|
forget(v);
|
2022-03-10 16:09:19 +08:00
|
|
|
reference
|
2020-08-24 16:18:31 +08:00
|
|
|
} else {
|
|
|
|
panic!("Expected CacheGetReply for CacheGetRequest");
|
|
|
|
}
|
2020-07-25 17:04:40 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-02-22 11:02:43 +08:00
|
|
|
pub extern "C" fn put(key: CSlice<u8>, list: &CSlice<i32>) {
|
2020-08-05 12:25:48 +08:00
|
|
|
let key = String::from_utf8(key.as_ref().to_vec()).unwrap();
|
|
|
|
let value = list.as_ref().to_vec();
|
2020-08-24 16:18:31 +08:00
|
|
|
unsafe {
|
2023-02-22 11:02:43 +08:00
|
|
|
KERNEL_CHANNEL_1TO0
|
|
|
|
.as_mut()
|
|
|
|
.unwrap()
|
|
|
|
.send(Message::CachePutRequest(key, value));
|
2020-08-24 16:18:31 +08:00
|
|
|
}
|
2020-07-25 17:04:40 +08:00
|
|
|
}
|