forked from tock/libtock-rs
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a Subscribe API to
libtock_platform
.
This API is based on the design at tock#341.
- Loading branch information
Showing
4 changed files
with
88 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
use crate::syscall_scope::ShareList; | ||
use crate::Syscalls; | ||
|
||
/// A `Subscribe` instance allows safe code to call Tock's Subscribe system | ||
/// call, by guaranteeing the upcall will be cleaned up before 'scope ends. It | ||
/// is generally used with the `syscall_scope` function, which offers a safe | ||
/// interface for constructing `Subscribe` instances. | ||
pub struct Subscribe<'scope, S: Syscalls, const DRIVER_NUM: u32, const SUBSCRIBE_NUM: u32> { | ||
_syscalls: core::marker::PhantomData<S>, | ||
|
||
// Make this struct invariant with respect to the 'scope lifetime. | ||
// | ||
// Covariance would be unsound, as that would allow code with a | ||
// `Subscribe<'static, ...>` to register an upcall that lasts for a shorter | ||
// lifetime, resulting in use-after-free if the upcall in invoked. | ||
// Contravariance would be sound, but is not necessary and may be confusing. | ||
// | ||
// Additionally, we want to have at least one private member of this struct | ||
// so that code outside this module cannot construct a `Subscribe` without | ||
// calling `ShareList::new`. | ||
_scope: core::marker::PhantomData<core::cell::Cell<&'scope ()>>, | ||
} | ||
|
||
impl<'scope, S: Syscalls, const DRIVER_NUM: u32, const SUBSCRIBE_NUM: u32> Drop | ||
for Subscribe<'scope, S, DRIVER_NUM, SUBSCRIBE_NUM> | ||
{ | ||
fn drop(&mut self) { | ||
S::unsubscribe(DRIVER_NUM, SUBSCRIBE_NUM); | ||
} | ||
} | ||
|
||
impl<'scope, S: Syscalls, const DRIVER_NUM: u32, const SUBSCRIBE_NUM: u32> ShareList<'scope> | ||
for Subscribe<'scope, S, DRIVER_NUM, SUBSCRIBE_NUM> | ||
{ | ||
unsafe fn new() -> Subscribe<'scope, S, DRIVER_NUM, SUBSCRIBE_NUM> { | ||
Subscribe { | ||
_syscalls: core::marker::PhantomData, | ||
_scope: core::marker::PhantomData, | ||
} | ||
} | ||
} | ||
|
||
/// A Tock kernel upcall. Upcalls are registered using the Subscribe system | ||
/// call, and are invoked during Yield calls. | ||
/// | ||
/// Each `Upcall` supports one or more subscribe IDs, which are indicated by the | ||
/// `SupportedIds` parameter. The types `AnySubscribeId` and `OneSubscribeId` | ||
/// are provided to use as `SupportedIds` parameters in `Upcall` | ||
/// implementations. | ||
pub trait Upcall<SupportedIds> { | ||
fn upcall(&self, arg0: u32, arg1: u32, arg2: u32); | ||
} | ||
|
||
trait AllowsId<const DRIVER_NUM: u32, const SUBSCRIBE_NUM: u32> {} | ||
|
||
pub struct AnyId; | ||
impl<const DRIVER_NUM: u32, const SUBSCRIBE_NUM: u32> AllowsId<DRIVER_NUM, SUBSCRIBE_NUM> for AnyId {} | ||
|
||
pub struct OneId<const DRIVER_NUM: u32, const SUBSCRIBE_NUM: u32>; | ||
impl<const DRIVER_NUM: u32, const SUBSCRIBE_NUM: u32> AllowsId<DRIVER_NUM, SUBSCRIBE_NUM> | ||
for OneId<DRIVER_NUM, SUBSCRIBE_NUM> {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters