diff options
| author | Emil Fresk <emil.fresk@gmail.com> | 2023-01-30 14:49:24 +0100 |
|---|---|---|
| committer | Henrik Tjäder <henrik@tjaders.com> | 2023-03-01 00:33:38 +0100 |
| commit | 5c1cefbf4e249c38467e3f6eb4e061e5b8073d6c (patch) | |
| tree | c0e8ab5b535ec4a192b9f6e83f29da8409c7016a /rtic-common/src | |
| parent | e65e532c2a342f77080ac6fc8e5be11aa7d82575 (diff) | |
Add `rtic-arbiter`
Diffstat (limited to 'rtic-common/src')
| -rw-r--r-- | rtic-common/src/dropper.rs | 26 | ||||
| -rw-r--r-- | rtic-common/src/lib.rs | 1 |
2 files changed, 27 insertions, 0 deletions
diff --git a/rtic-common/src/dropper.rs b/rtic-common/src/dropper.rs new file mode 100644 index 0000000..a4b4d15 --- /dev/null +++ b/rtic-common/src/dropper.rs @@ -0,0 +1,26 @@ +//! A drop implementation runner. + +/// Runs a closure on drop. +pub struct OnDrop<F: FnOnce()> { + f: core::mem::MaybeUninit<F>, +} + +impl<F: FnOnce()> OnDrop<F> { + /// Make a new droppper given a closure. + pub fn new(f: F) -> Self { + Self { + f: core::mem::MaybeUninit::new(f), + } + } + + /// Make it not run drop. + pub fn defuse(self) { + core::mem::forget(self) + } +} + +impl<F: FnOnce()> Drop for OnDrop<F> { + fn drop(&mut self) { + unsafe { self.f.as_ptr().read()() } + } +} diff --git a/rtic-common/src/lib.rs b/rtic-common/src/lib.rs index 3c75856..b8b5e0d 100644 --- a/rtic-common/src/lib.rs +++ b/rtic-common/src/lib.rs @@ -4,5 +4,6 @@ #![deny(missing_docs)] //deny_warnings_placeholder_for_ci +pub mod dropper; pub mod wait_queue; pub mod waker_registration; |
