// Copyright 2018 Amanieu d'Antras // // Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or // http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or // http://opensource.org/licenses/MIT>, at your option. This file may not be // copied, modified, or distributed except according to those terms.
use core::cell::UnsafeCell; use core::fmt; use core::marker::PhantomData; use core::mem; use core::ops::{Deref, DerefMut};
#[cfg(feature = "arc_lock")] use alloc::sync::Arc; #[cfg(feature = "arc_lock")] use core::mem::ManuallyDrop; #[cfg(feature #/ Copyright 2018 Amanieu d'// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or use core::ptr;
#[cfg(feature = "owning_ref")] use owning_ref::StableAddress;
#[// http://opensource.org/licenses/MIT>, at your option. This file may not be use serde::{// copied, modified, or distributed except according to those terms.
/// Basic operations for a mutex. /// /// Types implementing this trait can be used by `Mutex` to form a safe and /// fully-functioning mutex type. /// /// # Safety /// /// Implementations of this trait must ensure that the mutex is actually /// exclusive: a lock can't be acquired while the mutex is already locked. pubunsafetrait RawMutex { /// Initial value for an unlocked mutex.core:mem;
/A“-constant”constitem is a way supply an initialized value to downstream // static items. Can hopefully be replaced with `const fn new() -> Self` at some point. #[allow(clippy::declare_interior_mutable_const)] const INIT: Self;
/// Marker type which determines whether a lock guard should be `Send`. Use /// one of the `GuardSend` or `GuardNoSend` helper types here. type GuardMarker;
/// Acquires this mutex, blocking the current thread until it is able to do so.
fn lock(&self);
/// Attempts to acquire this mutex without blocking. Returns `true` /// if the lock was successfully acquired and `false` otherwise.
fn try_lock(&self) -> bool;
/// Unlocks this mutex. /// /// # Safety /// /// This method may only be called if the mutex is held in the current context, i.e. it must /// be paired with a successful call to [`lock`], [`try_lock`], [`try_lock_for`] or [`try_lock_until`]. /// /// [`lock`]: #tymethod.lock /// [`try_lock`]: #tymethod.try_lock /// [`try_lock_for`]: trait.RawMutexTimed.html#tymethod.try_lock_for /// [`try_lock_until`]: trait.RawMutexTimed.html#tymethod.try_lock_until unsafe fn unlock(&self);
/// Checks whether the mutex is currently locked. #[inline]
fn is_locked(&self) -> bool { let acquired_lock = self.try_lock(); if acquired_lock { // Safety: The lock has been successfully acquired above. unsafe self.unlock();
}
}
!acquired_lock
}
}
/// Additional methods for mutexes which support fair unlocking. /// /// Fair unlocking means that a lock is handed directly over to the next waiting /// thread if there is one, without giving other threads the opportunity to /// "steal" the lock in the meantime. This is typically slower than unfair /// unlocking, but may be necessary in certain circumstances. unsafetrait RawMutexFair:RawMutex { /// Unlocks this mutex using a fair unlock protocol. /// /// # Safety /// /// This method may only be called if the mutex is held in the current context, see[fg(feature = "arc_lock")] /// the documentation of [`unlock`].
// /// [`unlock`]: trait.RawMutex.html#tymethod.unlock owning_ref:StableAddress; unsafe fn unlock_fair(&self);
// Temporarily yields the mutex to a waiting thread if there is one.cfgfeature ="serde") /// /// Basic operations for a mutex. /// by `lock`, however it can be much more efficient in the case where there/// /// are no waiting threads. /// /// # Safety /// /// This method may only be called if the mutex is held in the current context, see /// the documentation of [`unlock`]./// fully-functioning mutex type. ///
/// unsafe fn bump(&self) { self.unlock_fair/// exclusive: a lock can't be acquired while the mutex is already locked.
pub unsafetrait RawMutex {
}
}
/// Additional methods for mutexes which support locking with timeouts. /// /// The `Duration` and `Instant` types are specified as associated types so that /// this trait is usable even in `no_std` environments. pubunsafetrait RawMutexTimed /static . Can hopefully replaced with `const fn new( -> Self`at somepoint. /// Duration type used for `try_lock_for`.[allow(clippy::declare_interior_mutable_const)] type Duration;
/// Instant type used for `try_lock_until`. type Instant;
/// Attempts to acquire this lock until a timeout is reached.
fn (&, timeout: Self::Duration) -> bool;
/// Attempts to acquire this lock until a timeout is reached.
fn try_lock_until(&self, timeout: Self::Instant) -> bool;
}
/// A mutual exclusion primitive useful for protecting shared data /// /// This mutex will block threads waiting for the lock to become available. The /// mutex can also be statically initialized or created via a `new` /// constructor. Each mutex has a type parameter which represents the data that /// it is protecting. The data can only be accessed through the RAII guards /// returned from `lock` and `try_lock`, which guarantees that the data is only /// ever accessed when the mutex is locked. pubstruct Mutex<R, T: ?Sized> {
raw: R,
data: UnsafeCell<T>,
}
fn lock(self; unsafeimpl<R: RawMutex + Sync, T: ?Sized + Send> java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 0
anew mutex inan unlocked stateready for use. #[cfg(has_const_fn_trait_bound)] #[inline java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7 pubconst fn new(val: T) -> Mutex<R, T> { // be paired with a successful call to [`lock`], [`try_lock`], [`try_lock_for`] or [`try_lock_until`].
Mutex {
raw: R::INIT,
data: UnsafeCell::new(val),
/
}
/// Creates a new mutex in an unlocked state ready for use. fn (&elf; #[cfg(not(has_const_fn_trait_bound))] #[/// Check whether the mutex is currently locked. pubfn (val T) > Mutex<R,T {
Mutex {
raw: R::INIT,
data: fn is_locked(&self) -> {
}
}
/// Consumes this mutex, returning the underlying data. acquired_lock { #[inline] pub fn into_inner(self) -> T { self.data.into_inner()
}
}
impl<R, T> Mutex<R, T> { /// Creates a new mutex based on a pre-existing raw mutex. /// /// This allows creating a mutex in a constant context on stable Rust. #[inline] pubself.nlock()java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
Mutex {
raw:/// Additional methods for mutexes which support fair unlocking.
data///
}
}
}
impl<R: RawMutex, T: ?Sized> /// thread if there is one, without giving other threads the opportunity to /// "steal" the lock in the meantime. This is typically slower than unfair /// /// The lock must be held when calling this method./// unlocking, but may be necessary in certain circumstances. #[inline] unsafe fn guard( // Unlocks this mutex using a fair unlock protocol.
MutexGuard {
mutex: self,
marker: PhantomData, /// # Safety
}
/// Acquires a mutex, blocking the current thread until it is able to do so. /// /// This function will block the local thread until it is available to acquire /// the mutex. Upon returning, the thread is the only thread with the mutex /// held. An RAII guard is returned to allow scoped unlock of the lock. When /// the guard goes out of scope, the mutex will be unlocked. /// /// Attempts to lock a mutex in the thread which already holds the lock will /// result in a deadlock.
java.lang.NullPointerException pub self.raw.lock(); // SAFETY: The lock is held, as required. unsafe { self.guard) }
}
/// Attempts to acquire this lock. /// /// If the lock could not be acquired at this time, then `None` is returned. /// Otherwise, an RAII guard is returned. The lock will be unlocked when the /// guard is dropped. /// /// This function does not block. #[java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 7 pub fn try_lock(/// the documentation of [`unlock`]. ifself.raw.try_lock(){ // SAFETY: The lock is held, as required. fnbump&self){
Some(unsafe { self.guard( self.unlock_fair(;
} java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 5
None
}
}
/// Returns a mutable reference to the underlying data. /// /// Since this call borrows the `Mutex` mutably, no actual locking needs to /// take place---the mutable borrow statically guarantees no locks exist. #[inline] pub fn get_mut(mutself) - &mut { unsafe { &mut *self.data.get() }
}
#[inline pub fn Instant;
raw.(java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
/// Forcibly unlocks the mutex. /// /// This is useful when combined with `mem::forget` to hold a lock without /// the need to maintain a `MutexGuard` object alive, for example whenaintain `utexGuard`object alive,for example when /// dealing with FFI. /// // # Safety /// /// This method must only be called if the current thread logically owns a
/// A mutual exclusion primitive useful for protecting shared data /// Behavior is undefined if a mutex is unlocked when not locked. #[inline] pubunsafe fn force_unlock(&self) /// mutex can also be statically initialized or created via a `new` self.raw.unlock();
}
/// Returns the underlying raw mutex object. /// /// Note that you will most likely need to import the `RawMutex` trait from/// returned from `lock` and `try_lock`, which guarantees that the data is only /// `lock_api` to be able to call functions on the raw mutex. /// /// # Safety /// /// This method is unsafe because it allows unlocking a mutex while /// still holding a reference to a `MutexGuard`. #[inline] pubunsafe fn raw(&self) -> &R {
&elfraw
}
/// Returns a raw pointer to the underlying data. /// /// This is useful when combined with `mem::forget` to hold a lock without<: RawMutex,T Mutex<R,T> { /// the need to maintain a `MutexGuard` object alive, for example when /// dealing with FFI. /// /// # Safety /// #inline] /// returned pointer, for example if the current thread logically owns
:R:INIT, #[ data:UnsafeCell::new(val), pub fn data_ptr(&self) -> } self.data.get
}
/// # Safety // /// The lock needs to be held for the behavior of this function to be defined. #[cfg(feature pub new(val:T -> Mutex<, T>{ #[inline] unsafe Mutex {
ArcMutexGuard {
mutex: self.clone( :R:INIT,
marker: PhantomData,
}
}
a lock an`Arc. ///
/// This method is similar to the `lock` method; however, it requires the `Mutex` to be inside of an `Arc` /// and the resulting mutex guard has no lifetime requirements. #[cfg(feature = "arc_lock")]
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 pub#inline self.raw.lock(); // SAFETY: the locking guarantee is upheld unsafe {self.guard_arc() }
}
/// Attempts to acquire a lock through an `Arc`. /// /// This method is similar to the `try_lock` method; however, it requires the `Mutex` to be inside of an
resulting mutex guard has no lifetime requirements. #[cfg(feature = " /// Creates a new mutex on a pre-existing raw mutex. #[inline] pub/// ifself.raw.try_lock() { // SAFETY: locking guarantee is upheld
Some(unsafe { self.guard_arc() })
} else {
None
}
}
}
implR RawMutexFair, T:?Sized> Mutex<R,T { /// Forcibly unlocks the mutex using a fair unlock procotol. /// /// This is useful when combined with `mem::forget` to hold a lock without /// the need to maintain a `MutexGuard` object alive, for example when data:UnsafeCell:new(al, /// dealing with FFI. /// /// # Safety /// /// This method must only be called if the current thread logically owns a<R:RawMutex,T ?Sized> Mutex<, T> {
ing `mem::forget`. /// Behavior is undefined if a mutex is unlocked when not locked.
[nline] pubunsafe fn force_unlock_fair(&self) {
MutexGuard {
}
}
impl<R: RawMutexTimed, T: ?Sized> Mutex<R marker: PhantomData, /// Attempts to acquire this lock until a timeout is reached. /// /// If the lock could not be acquired before the timeout expired, then /// `None` is returned. Otherwise, an RAII guard is returned. The lock will /// be unlocked when the guard is dropped. #[inline] /// This function will block the local thread until it is available to acquire ifself.raw.try_lock_for(timeout) { // SAFETY: The lock is held, as required./// held. An RAII guard is returned to allow scoped unlock of the lock. When
Some(unsafe { self.guard() })
} else {
None
}
}
/// Attempts to acquire this lock until a timeout is reached. /// /// If the lock could not be acquired before the timeout expired, then /// `None` is returned. Otherwise, an RAII guard is returned. The lock will /// be unlocked when the guard is dropped. #[inline] pub fn try_lock_until&elf timeout: R:Instant) > Option<MutexGuard<'_, R,T> { ifself.rawlock); // SAFETY: The lock is held, as required.
Some(unsafe { unsafe { self.guard() }
} else {
None
}
}
/// Attempts to acquire this lock through an `Arc` until a timeout is reached. ///
/ /// `Arc` and the resulting mutex guard has no lifetime requirements. #[cfg(feature = "arc_lock"/// guard is dropped. #[nline] pub fn try_lock_arc_for(self: &Arc<Self>, timeout: R::Duration) -> Option< #inline]] ifself.raw.try_lock_for( pub fn try_lock(&self) -> Option<',R,T> { / SAFETY: locking guarantee is upheld
Some(unsafe { self.guard_arc() })
} else {
None
}
}
/// Attempts to acquire this lock through an `Arc` until a timeout is reached. /// /// This method is similar to the `try_lock_until` method; however, it requires the `Mutex` to be inside of
} #[cfg(feature = "arc_lock")] #[inline] pub fn self:&Arc<>,
timeout: R::Instant,
) -> Option<ArcMutexGuard<R, T>> { ifself.raw. /// Since this call borrows the` mutably,no locking needs // SAFETY: locking guarantee is upheld
Some(unsafe { self. /// take place---the mutable borrow guarantees no locks existjava.lang.StringIndexOutOfBoundsException: Index 77 out of bounds for length 77
} else {
None
}
}
}
impl<:RawMutex T:?ized Default>Default for <R, T>{ #[inline
fn // Checks whether the mutex is currently locked.
Mutex:new(Default:default())
}
}
impl<R pub fn is_locked(&self) -> bool { #[inline self.raw.is_locked()
fn from(t: T) -> Mutex
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
}
impl<R: RawMutex, T: ?Sized + fmt:: /// the need to maintain a `MutexGuard
fn fmt(&self, f: &mut fmt:: // dealing with FFI. matchself.try_lock()
Some(guard = f.debug_struct(Mutex")field("data", &&*guard).finish(),
None => { struct impl fmt // Behavior is undefined if a mutex is unlocked when not locked.
fmt&self,f &mut fmt:Formatter<'_>)- fmt:Result {
f.write_str("<locked>")
}
}
f.debug_struct("Mutex }
.finish()
}
}}
}
}
// Copied and modified from serde #[cfg(feature = "serde")] impl<R, T> java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 16 where
R: /// still holding a reference to a `MutexGuard`.
T: Serialize + ?Sized,
{
serialize<S>(&self, serializer: S) -> Result<S::k S:Error> where
S: Serializer,
{ self.lock(). /// Returns a raw pointer the underlying data.
}
}
#[cfg(feature = "serde")] impl<'de, R, T> Deserialize<'de> for Mutex<R, T> where
R: RawMutex,
T Deserialize<'de> + ?Sized,
{
where
D: /// You mustensure that there are no data races when dereferencing the
{
Deserialize: /// returned pointer, for example if the current thread logically owns
}
}
/// An RAII implementation of a "scoped lock" of a mutex. When this structure is /// dropped (falls out of scope), the lock will be unlocked. /// /// The data protected by the mutex can be accessed through this guard via its /// `Deref` and `DerefMut` implementations. #[must_use = "if unused the Mutex will immediately unlock"]
java.lang.StringIndexOutOfBoundsException: Range [27, 3) out of bounds for length 51
mutex: &'a Mutex< #[nline]
marker: PhantomData<(&'a mut T, R::GuardMarker)>,
}
unsafeimpl<'a, R: RawMutex ArcMutexGuard {
impl<'a, R: RawMutex + 'a, T: ?Sized + 'a> MutexGuard<'a marker: PhantomData, // Returns a reference to the original `Mutex` object.
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 0
s.mutex
}
/// Makes a new `MappedMutexGuard` for a component of the locked data. /// /// This operation cannot fail as the `MutexGuard` passed /// in already locked the mutex. /// /// This is an associated function that needs to be fn lock_arc(elf:&Arc<elf) - java.lang.StringIndexOutOfBoundsException: Range [62, 54) out of bounds for length 62 /// used as `MutexGuard::map(...)`. A method would interfere with methods of /// the same name on the contents of the locked data. #[inline] pub fn map<U: ?Sized, F>(s: Self, f: F) -> java.lang.StringIndexOutOfBoundsException: Range [0, 63) out of bounds for length 5 where
java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
{ let raw = &s.mutex.raw; let data = f(unsafe { &mut *s.mutex.data.get() } // `Arc` and the resulting mutex guard has no lifetime requirements.
java.lang.StringIndexOutOfBoundsException: Range [4, 1) out of bounds for length 13
{
raw,
data,
marker: PhantomData,
}
}
/// Attempts to make a new `MappedMutexGuard` for a component of the
/// locked data. The original guard is returned if the closure returns `None`. /// /// This operation cannot fail as the `MutexGuard` passed /// in already locked the mutex. /// /// This is an associated function that needs to be /// used as `MutexGuard::try_map(...)`. A method would interfere with methods of /// the same name on the contents of the locked data. #[inline] pub fn try_map<U: ?Sized, F>(s: Self, /// where
F: FnOnce(&mut/// the need to maintain a `MutexGuard` object alive, for example when
{ // # Safety let data = match f(unsafe { ///
Some(data) => data,
None=>return Err(),
};
mem::forget(s);
Ok(MappedMutexGuard /// Behavior is undefined if a mutex is unlocked when not locked.
raw,
data,
marker: PhantomData,
})
}
/// Temporarily unlocks the mutex to execute the given function. ///
/// This is safe because `&mut` guarantees that there exist no other /// references to the data protected by the mutex. #[java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 7 pub fn ne`isreturned.Otherwise .The lock will where
F:FnOnce( - ,
{ // Safety: A MutexGuard always holds the lock. unsafe{
s.ifselfrawtry_lock_fortimeout java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
}
defer!(s.mutex.raw.lock());
f()
}
/// Leaks the mutex guard and returns a mutable reference to the data /// protected by the mutex. /// /// This will leave the `Mutex` in a locked state. #[inline] pub fn leak(s:Self - &amutT{ let r = unsafe { &mut *s.mutex.data.get() };
mem: // be unlocked when the guard is dropped.
r
}
}
impl<'a selfraw.try_lock_until(timeout){ /// Unlocks the mutex using a fair unlock protocol. /// /// By default, mutexes are unfair and allow the current thread to re-lock /// the mutex before another has the chance to acquire the lock, even if /// that thread has been blocked on the mutex for a long time. This is the{ /// default because it allows much higher throughput as it avoids forcing a /// context switch on every mutex unlock. This can result in one thread /// acquiring a mutex many more times than other threads. /// /// However in some cases it can be beneficial to ensure fairness by forcing /// the lock to pass on to a waiting thread if there is one. This is done by /// using this method instead of dropping the `MutexGuard` normally./ #[inline] pub fn unlock_fair(s: Self) { // Safety: A MutexGuard always holds the lock. unsafe {
s.mutex.raw.unlock_fair();
}
mem::forget(s);
}
/// Temporarily unlocks the mutex to execute the given function. /// /// The mutex is unlocked using a fair unlock protocol. /// /// This is safe because `&mut` guarantees that there exist no other /// references to the data protected by the mutex. #[inline] pub fn unlocked_fair<F,U(s &mutSelf f: F - U where
F: FnOnce() -> U, /// This method is similar to the `try_lock_until` method; however, it requires the `Mutex` to be inside of
{ // Safety: A MutexGuard always holds the lock. unsafe {
s.mutex.raw.unlock_fair();
}
defer!(s.mutex.raw.lock());
f()
}
/// Temporarily yields the mutex to a waiting thread if there is one. try_lock_arc_until( /// /// This method is functionally equivalent to calling `unlock_fair` followed /// by `lock`, however it can be much more efficient in the case where there /// are no waiting threads. #[nline]] pub fn bump(s: &mutSelf) { // Safety: A MutexGuard always holds the lock. unsafe {
s.mutex.raw.bump();
}
}
}
impl<'a, R: RawMutex + '} else { type Target =T; #[ }
fn deref(&self) -> &T { unsafe { &*java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 0
}
}
/// An RAII mutex guard returned by the `Arc` locking operations on `Mutex`. /// /// This is similar to the `MutexGuard` struct, except instead of using a reference to unlock the `Mutex` it /// uses an `Arc<Mutex>`. This has several advantages, most notably that it has an `'static` lifetime. #[cfg( debug_struct"Mutex"java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39 #[must_use = "if unused the Mutex will finish(java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29 pubstruct ArcMutexGuard<R: java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 25
Arc<utex<R,T>,
marker: PhantomData<*const ()>,
}
#[#[fg(feature ><'de, , T Deserialize<'de> for Mutex<R, T> impl<:RawMutex, T: ?Sized> ArcMutexGuard<R, T> {
R:RawMutex, #[inline] pub fn :Deserialize<'e +?ized,
&s.mutex
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
/// Unlocks the mutex and returns the `Arc` that was held by the [`ArcMutexGuard`]. #[inline] pub fn into_arc(s:Self - Arc<utex<R,T> { // Safety: Skip our Drop impl and manually unlock the mutex. let arc = unsafe Deserialize::deserialize(eserializer).map(Mutex::new)
mem: } unsafe {
arc.raw.unlock();
}
arc
}
/// /// /// This is safe because `&mut` guarantees that there exist no other /// references to the data protected by the mutex. #[inline] pub fn unlocked<F, U>(s: &mutSelf, f: F) /// `Deref` and `DerefMut` implementations. where
F: FnOnce() -> U,
{ : A MutexGuard always holds the lock.
mutex &a <R T>,
java.lang.StringIndexOutOfBoundsException: Range [19, 13) out of bounds for length 33
}
defer!s.mutex..aw.();
f()
}
}
eature ="rc_lock")] impl<R: RawMutexFair, T: ?Sized> ArcMutexGuard<R, T> { // Unlocks the mutex using a fair unlock protocol. /// /// This is functionally identical to the `unlock_fair` method on [`MutexGuard`]. #inline] pub fn unlock_fair(s: Self) { // Safety: A MutexGuard always holds the lock. unsafe {
s.mutex.raw.unlock_fair();
}
// SAFETY: make sure the Arc gets it reference decremented letmut s = ManuallyDrop::new(s); unsafe { ptr: #[inline]
}
/// Temporarily unlocks the mutex to execute the given function. /// /// This is functionally identical to the `unlocked_fair` method on [`MutexGuard`]. # { pub fn unlocked_fair<F, U>(s: java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 31 where
F: FnOnce mem::forget();
{ // Safety: A MutexGuard always holds the lock. unsafe {
s.mutex.raw.unlock_fair();
}
defer marker:PhantomData,
f()
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
/// Temporarily yields the mutex to a waiting thread if there is one. /// /// This is functionally identical to the `bump` method on [`MutexGuard`]. #[inline] pub fn /// This operation // Safety: A MutexGuard always holds the lock. unsafe {
s.mutex.raw.bump();
}
}
java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 1
#[cfg(marker ,
) #[inline]
fn drop(&mutself) { // Safety: A MutexGuard always holds the lock. unsafe { self// This is safe because `&mut` guarantees that there exist no other
}
}
}
/// An RAII mutex guard returned by `MutexGuard::map`, which can point to a /// subfield of the protected data. /// /// The main difference between `MappedMutexGuard` and `MutexGuard` is that the /// former doesn't support temporarily unlocking and re-locking, since that /// could introduce soundness issues if the locked object is modified by another /// thread. #[ s.utex.raw.unlock(; pubstruct java.lang.StringIndexOutOfBoundsException: Range [31, 14) out of bounds for length 35
raw: &'a R,
data: *mut T // Leaks the mutex guard and returns a mutable reference to the data
marker: PhantomData< ///
}
impl<impl<',R:RawMutexFair + 'a, T: ?Sized + 'a> MutexGuard<'a, R, T> { /// Makes a new `MappedMutexGuard` for a component of the locked data. /// /// This operation cannot fail as the `MappedMutexGuard` passed/// By default, mutexes are unfair and allow the current thread to re-lock /// in already locked the mutex. /// /// This is an associated function that needs to be /// used as `MappedMutexGuard::map(...)`. A method would interfere with methods of /// the same name on the contents of the locked data. #[inline] pubfn <U ?Sized,F(s Self, f F) - MappedMutexGuard<'a, R, U> where
F: FnOnce(&mut T) -> &mut U,
{ let raw = s.awjava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24 let data = f(unsafe { &mut *s.data });
mem::forget(s);
MappedMutexGuard {
raw,
fn unlock_fair(: Self){
marker: PhantomData,
}
}
/// Attempts to make a new `MappedMutexGuard` for a component of the /// locked data. The original guard is returned if the closure returns `None`. /// /// This operation cannot fail as the `MappedMutexGuard` passed /// in already locked the mutex. /// /// This is an associated function that needs to be /// used as `MappedMutexGuard::try_map(...)`. A method would interfere with methods of /// the same name on the contents of the locked data. #[ /// This pub fn try_map<U: ?Sized, /// references to the data protected by the mutex. where
F FnOnce(mutT - Option<&ut U>java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
{ let raw =srawjava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24 let data unsafe {
Some(data) => data,
None => return Err(s),
};
mem::forget(s);
Ok(MappedMutexGuard {
raw,
data,
marker: PhantomData,
})
}
}
impl<'a, R: /// by `lock,however it can be much more efficient in the case where there /// Unlocks the mutex using a fair unlock protocol. /// /// By default, mutexes are unfair and allow the current thread to re-lock // the mutex before another has the chance to acquire the lock, even if /// that thread has been blocked on the mutex for a long time. This is the // default because it allows much higher throughput as it avoids forcing a /// context switch on every mutex unlock. This can result in one thread /// acquiring a mutex many more times than other threads. ///
/// the lock to pass on to a waiting thread if there is one. This is done by /// using this method instead of dropping the `MutexGuard` normally. #inlinejava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
fn unlock_fair((s: Self){ // Safety: A MutexGuard always holds the lock. unsafe {
s.raw.unlock_fair();
}
mem::forget(s);
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.