mirror of
https://github.com/alacritty/alacritty.git
synced 2024-11-11 13:51:01 -05:00
7aafbb757d
Keeping the license as part of every file bloats up the files unnecessarily and introduces an additional overhead to the creation of new modules. Since cargo already provides excellent dependency management, most of the code-reuse of Alacritty should occur through Rust's dependency management instead of copying it source. If code is copied partially, copying the license from the main license file should be just as easy as copying from the top of the file and making some adjustments based on where it is used is likely necessary anyways.
31 lines
798 B
Rust
31 lines
798 B
Rust
//! Synchronization types.
|
|
//!
|
|
//! Most importantly, a fair mutex is included.
|
|
|
|
use parking_lot::{Mutex, MutexGuard};
|
|
|
|
/// A fair mutex.
|
|
///
|
|
/// Uses an extra lock to ensure that if one thread is waiting that it will get
|
|
/// the lock before a single thread can re-lock it.
|
|
pub struct FairMutex<T> {
|
|
/// Data.
|
|
data: Mutex<T>,
|
|
/// Next-to-access.
|
|
next: Mutex<()>,
|
|
}
|
|
|
|
impl<T> FairMutex<T> {
|
|
/// Create a new fair mutex.
|
|
pub fn new(data: T) -> FairMutex<T> {
|
|
FairMutex { data: Mutex::new(data), next: Mutex::new(()) }
|
|
}
|
|
|
|
/// Lock the mutex.
|
|
pub fn lock(&self) -> MutexGuard<'_, T> {
|
|
// Must bind to a temporary or the lock will be freed before going
|
|
// into data.lock().
|
|
let _next = self.next.lock();
|
|
self.data.lock()
|
|
}
|
|
}
|