sel4_kit/ipc.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
//! 提供 ipc 相关支持
//!
//! 提供异步的 [Notification] `poll`
use core::task::Poll;
use sel4::{
MessageInfo,
cap::{Endpoint, Notification},
with_ipc_buffer_mut,
};
///// poll 一个 [Notification]
/////
///// 这是一个异步操作,当 poll 的时候会检查 [Notification] 是否有 signal,如果有则返回相关的 badge,
///// 如果没有,则返回 0 作为 badge
/////
///// **TIPS: 如果创建一个默认的 [Notification] 之后没有设置的话,那么处于 unbadged 状体,即便有也是 None**
//pub fn poll_notification(noti: Notification) -> Option<u64> {
// let (_, badge) = with_ipc_buffer_mut(|ib| ib.inner_mut().seL4_Poll(noti.bits()));
// match badge {
// 0 => Option::None,
// _ => Option::Some(badge),
// }
//}
//
///// poll 一个 [Endpoint]
/////
///// 这是一个异步操作,当 poll 的时候会检查 [Endpoint] 是否有消息,如果有则返回相关的 消息和badge,
///// 如果没有,则返回 0 作为 badge
/////
///// **TIPS: 如果创建一个默认的 [Endpoint] 之后没有设置的话,那么处于 unbadged 状体,即便有也是 None**
//pub fn poll_endpoint(ep: Endpoint) -> Option<(MessageInfo, u64)> {
// let (msg, badge) = with_ipc_buffer_mut(|ib| ib.inner_mut().seL4_Poll(ep.bits()));
// match badge {
// 0 => Option::None,
// _ => Option::Some((MessageInfo::from_inner(msg), badge)),
// }
//}
/// poll 一个 [Notification]
///
/// 这是一个异步操作,当 poll 的时候会检查 [Notification] 是否有 signal,如果有则返回相关的 badge,
/// 如果没有,则返回 0 作为 badge
///
/// **TIPS: 如果创建一个默认的 [Notification] 之后没有设置的话,那么处于 unbadged 状体,即便有也是 None**
pub fn poll_notification(noti: Notification) -> Poll<u64> {
let (_, badge) = with_ipc_buffer_mut(|ib| ib.inner_mut().seL4_Poll(noti.bits()));
match badge {
0 => Poll::Pending,
_ => Poll::Ready(badge),
}
}
/// poll 一个 [Endpoint]
///
/// 这是一个异步操作,当 poll 的时候会检查 [Endpoint] 是否有消息,如果有则返回相关的 消息和badge,
/// 如果没有,则返回 0 作为 badge
///
/// **TIPS: 如果创建一个默认的 [Endpoint] 之后没有设置的话,那么处于 unbadged 状体,即便有也是 None**
pub fn poll_endpoint(ep: Endpoint) -> Poll<(MessageInfo, u64)> {
let (msg, badge) = with_ipc_buffer_mut(|ib| ib.inner_mut().seL4_Poll(ep.bits()));
match badge {
0 => Poll::Pending,
_ => Poll::Ready((MessageInfo::from_inner(msg), badge)),
}
}