diff options
author | Brian Cully <bjc@kublai.com> | 2019-08-06 16:31:34 -0400 |
---|---|---|
committer | Brian Cully <bjc@kublai.com> | 2019-08-06 16:31:34 -0400 |
commit | 392239c7f522acb7ca5847a48dd9ab2480242924 (patch) | |
tree | b02f1f568085ae1dcb3c33c780d49a8d1a77a2eb /examples | |
parent | b0c6c4f9a45cf2b965acd3d10499e9df54929b36 (diff) | |
download | clint-392239c7f522acb7ca5847a48dd9ab2480242924.tar.gz clint-392239c7f522acb7ca5847a48dd9ab2480242924.zip |
Add compatibilty with rust-stable.
* Add feature flag for const-fn functionality, which simplifies some
things and lets this crate run on architectures where atomic CAS
isn't available (e.g., thumbv6).
* Remove `const fn` where necessary to compile under rust-stable.
* BREAKING CHANGE - Change signature of `Handler::replace` to take a
mutable borrow. This is required because the underlying type is
now a NonNull, which needs `mut`. The old behavior was never
desired, but a consequence of trying to avoid `Option` by using a
default handler.
* Use lazy_static crate for initialization of Handler/HandlerArray.
* Specify Sync for Handler. This is not amazing, since it isn't, but
it's necessary for initialization in static contexts inside
`lazy_static`. This should be fine, because any actual
manipulation of the handler is done in unsafe functions.
Diffstat (limited to 'examples')
-rw-r--r-- | examples/dummy.rs | 11 | ||||
-rw-r--r-- | examples/scope.rs | 7 |
2 files changed, 14 insertions, 4 deletions
diff --git a/examples/dummy.rs b/examples/dummy.rs index 7e7c237..cfcd717 100644 --- a/examples/dummy.rs +++ b/examples/dummy.rs @@ -1,24 +1,29 @@ use clint::Handler; +#[macro_use] +extern crate lazy_static; + // Wrapper used to call through to `example_handler` via `closure` in // `main`. `Handler::new()` places a do-nothing handler in this at // compile-time, in case the interrupt using this handler is fired // before being `replace`d in `main`. -static mut HANDLER: Handler = Handler::new(); +lazy_static! { + static ref HANDLER: Handler<'static> = Handler::new(); +} fn main() { let mut x: u32 = 0; // Create a closure to take a mutable reference to `x` for use in // `example_handler`. - let closure = move || example_handler(&mut x); + let mut closure = move || example_handler(&mut x); // Swap out the do-nothing handler with our closure that calls // through to `example_handler`. Ideally, the interrupt which uses // this handler would be disabled while this happens, but as this // is a demo, and there aren't any actual interrupts firing, this // is left as an exercise to the reader. - unsafe { HANDLER.replace(&closure) }; + unsafe { HANDLER.replace(&mut closure) }; // Simulate firing the interrupt. dummy_interrupt(); diff --git a/examples/scope.rs b/examples/scope.rs index cd17570..8df0702 100644 --- a/examples/scope.rs +++ b/examples/scope.rs @@ -1,6 +1,11 @@ use clint::HandlerArray; -static HANDLERS: HandlerArray = HandlerArray::new(); +#[macro_use] +extern crate lazy_static; + +lazy_static! { + static ref HANDLERS: HandlerArray<'static> = HandlerArray::new(); +} fn main() { let mut cl = || println!("whoa!"); |