2020-08-05 12:25:48 +08:00
|
|
|
use alloc::string::String;
|
2020-07-25 17:04:40 +08:00
|
|
|
use cslice::{CSlice, AsCSlice};
|
2020-08-06 10:12:22 +08:00
|
|
|
use core::mem::{transmute, forget};
|
2020-08-05 12:25:48 +08:00
|
|
|
use super::{KERNEL_CHANNEL_0TO1, KERNEL_CHANNEL_1TO0, Message};
|
2020-07-25 17:04:40 +08:00
|
|
|
|
|
|
|
pub extern 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 {
|
|
|
|
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 {
|
|
|
|
let slice = transmute(v.as_c_slice());
|
|
|
|
// we intentionally leak the memory here,
|
|
|
|
// which does not matter as core1 would restart
|
|
|
|
forget(v);
|
|
|
|
slice
|
|
|
|
} else {
|
|
|
|
panic!("Expected CacheGetReply for CacheGetRequest");
|
|
|
|
}
|
2020-07-25 17:04:40 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub extern 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 {
|
|
|
|
KERNEL_CHANNEL_1TO0.as_mut().unwrap().send(Message::CachePutRequest(key, value));
|
|
|
|
}
|
2020-07-25 17:04:40 +08:00
|
|
|
}
|
|
|
|
|