From 188a08c3a340005d59d497e836993cb9349c9cbe Mon Sep 17 00:00:00 2001 From: Christian Cunningham Date: Mon, 22 Aug 2022 20:54:54 -0700 Subject: Initial state --- src/sync.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/sync.rs (limited to 'src/sync.rs') diff --git a/src/sync.rs b/src/sync.rs new file mode 100644 index 0000000..cd626fa --- /dev/null +++ b/src/sync.rs @@ -0,0 +1,62 @@ +//! # Synchronization module +//! +//! Provides synchronization objects for thread-safe memory sharing. +use core::cell::UnsafeCell; + +/// # Synchronization interfaces +/// +/// Provides Synchronization traits. +pub mod interface { + /// # Mutex Trait + /// + /// Basic Locking primitive to allow single-process access to data + pub trait Mutex { + /// # The data + /// + /// Each mutex protects some internal data from modification across + /// processes when it is in use. This is important if the process + /// is preempted while the function is using it. + type Data; + /// # Locking mechanism + /// + /// Locks the mutex to access the data in a closure. + /// The data can be read and modified in this closure without worry + /// of poisoning the data across processes. + fn lock<'a, R>(&'a self, f: impl FnOnce(&'a mut Self::Data) -> R) -> R; + } +} + +/// # Basic Lock Structure +pub struct NullLock where T: ?Sized { + /// The internal data to safely share + data: UnsafeCell, +} + +/// # Allow thread sharing +unsafe impl Send for NullLock where T: ?Sized + Send {} +/// # Allow thread sharing +unsafe impl Sync for NullLock where T: ?Sized + Send {} + +impl NullLock { + /// # Create a new instance of the lock + pub const fn new(data: T) -> Self { + Self { + data: UnsafeCell::new(data), + } + } +} + +impl interface::Mutex for NullLock { + /// # Underlying data of the lock + type Data = T; + + /// # Locking mechanism + /// + /// Locks the Mutex, and passes a mutable reference + /// to the encapsulated data to a closure. + fn lock<'a, R>(&'a self, f: impl FnOnce(&'a mut T) -> R) -> R { + let data = unsafe { &mut *self.data.get() }; + + f(data) + } +} -- cgit v1.2.1