- 
        Couldn't load subscription status. 
- Fork 13.9k
Open
Labels
C-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFCCategory: An issue tracking the progress of sth. like the implementation of an RFCE-hardCall for participation: Hard difficulty. Experience needed to fix: A lot.Call for participation: Hard difficulty. Experience needed to fix: A lot.E-help-wantedCall for participation: Help is requested to fix this issue.Call for participation: Help is requested to fix this issue.T-libs-apiRelevant to the library API team, which will review and decide on the PR/issue.Relevant to the library API team, which will review and decide on the PR/issue.
Description
Feature gates:
- #![feature(sync_nonpoison)]
- #![feature(nonpoison_condvar)]
- #![feature(nonpoison_mutex)]
- #![feature(nonpoison_rwlock)]
This is a tracking issue for versions of synchronization primitives that do not not need to worry about poison.
Public API
sync_nonpoison
The module itself and common types will be gated by this feature:
// std::sync
mod nonpoison {
    pub type TryLockResult<Guard> = Result<Guard, WouldBlock>;
    
    // Error type for failed locking
    pub struct WouldBlock;
}nonpoison_condvar
// std::sync::nonpoison
pub struct Condvar { /* ... */ }
impl Condvar {
    pub const fn new() -> Self;
    pub fn wait<'a, T>(&self, guard: MutexGuard<'a, T>) -> MutexGuard<'a, T>;
    pub fn notify_one(&self);
    pub fn notify_all(&self);
    pub fn wait_while<'a, T, F>(
        &self,
        guard: MutexGuard<'a, T>,
        condition: F,
    ) -> MutexGuard<'a, T>
    where
        F: FnMut(&mut T) -> bool;
    pub fn wait_timeout<'a, T>(
        &self,
        guard: MutexGuard<'a, T>,
        dur: Duration,
    ) -> (MutexGuard<'a, T>, WaitTimeoutResult);
    pub fn wait_timeout_while<'a, T, F>(
        &self,
        guard: MutexGuard<'a, T>,
        dur: Duration,
        condition: F,
    ) -> (MutexGuard<'a, T>, WaitTimeoutResult)
    where
        F: FnMut(&mut T) -> bool;
}
/* trait implementations from `std::sync::poison::Condvar` */nonpoison_mutex
// std::sync::nonpoison
pub struct Mutex<T: ?Sized> { /* ... */ }
impl<T> Mutex<T> {
    pub const fn new(t: T) -> Self;
}
impl<T: ?Sized> Mutex<T> {
    pub fn lock(&self) -> MutexGuard<'_, T>;
    pub fn try_lock(&self) -> TryLockResult<MutexGuard<'_, T>>;
    pub fn get_mut(&mut self) -> &mut T;
    pub fn into_inner(self) -> T
    where
        T: Sized;
}
/* trait implementations from `std::sync::poison::Mutex` */
pub struct MutexGuard<'a, T: ?Sized + 'a> { /* ... */ }
impl<'a, T: ?Sized> MutexGuard<'a, T> {
    // Unstable API from `mapped_lock_guards`
}
/* trait implementations from `std::sync::poison::MutexGuard` */
// Currently unstable under `mapped_lock_guards`, see that tracking issue for more
pub struct MappedMutexGuard<'a, T: ?Sized + 'a> { /* ... */ }nonpoison_rwlock
// std::sync::nonpoison
pub struct RwLock<T: ?Sized> { /* ... */ }
impl<T> RwLock<T> {
    pub const fn new(t: T) -> Self;
}
impl<T: ?Sized> RwLock<T> {
    pub fn read(&self) -> RwLockReadGuard<'_, T>;
    pub fn try_read(&self) -> TryLockResult<RwLockReadGuard<'_, T>>;
    pub fn write(&self) -> RwLockWriteGuard<'_, T>;
    pub fn try_write(&self) -> TryLockResult<RwLockWriteGuard<'_, T>>;
    pub fn get_mut(&mut self) -> &mut T;
    pub fn into_inner(self) -> T
    where
        T: Sized;
}
/* trait implementations from `std::sync::poison::RwLock` */
pub struct RwLockReadGuard<'a, T: ?Sized + 'a> { /* private fields */ }
impl<'a, T: ?Sized> RwLockReadGuard<'a, T> {
    // Unstable API from `mapped_lock_guards`
}
/* trait implementations from `std::sync::poison::RwLockReadGuard` */
impl<'a, T: ?Sized> RwLockWriteGuard<'a, T> {
    // Unstable API from `mapped_lock_guards`
}
/* trait implementations from `std::sync::poison::RwLockWriteGuard` */
// Currently unstable under `mapped_lock_guards`, see that tracking issue for more
pub struct MappedRwLockReadGuard<'a, T: ?Sized + 'a> { /* ... */ }
pub struct MappedRwLockReadGuard<'a, T: ?Sized + 'a> { /* ... */ }Steps / History
- ACP: Adding locks disregarding poison libs-team#169
-  Muteximplementation: Implementation:#[feature(sync_nonpoison)],#[feature(nonpoison_mutex)]#144022
-  RwLockimplementation Implementation:#[feature(nonpoison_rwlock)]#144648
-  Condvarimplementation Implementation:#[feature(nonpoison_condvar)]#144651
- Final comment period (FCP)1
- Stabilization PR
Unresolved Questions
-  Should existing types without poison be moved to this module? Barrier,LazyLock,OnceLock,ReentrantLock. (Answer: no, it only makes sense to move to thepoisonandnonpoisonmodules if there is a version for each)
-  Should we use this as an opportunity to change the variance of RwLockto supporttry_upgrade? AddRwlocktry_upgrademethod libs-team#514 / Tracking Issue forrwlock_try_upgrade#138559 (comment)
Related
- Move all existing poisonable types to std::sync::poisonand reexport them Tracking Issue forsync_poison_mod#134646
- The unstable ReentrantLockcurrently does not support poisoning Tracking Issue forReentrantLock#121440
- mapped_lock_guardsadds API to the guard types Tracking Issue for- mapped_lock_guards(- MappedMutexGuard,- MappedRwLockReadGuard,- MappedRwLockWriteGuard) #117108
Footnotes
nazar-pc, AhoyISki, nanoqsh and MolotovCherryoxalica, Visne, bryanhitc, Scripter17, aznhe21 and 2 more
Metadata
Metadata
Assignees
Labels
C-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFCCategory: An issue tracking the progress of sth. like the implementation of an RFCE-hardCall for participation: Hard difficulty. Experience needed to fix: A lot.Call for participation: Hard difficulty. Experience needed to fix: A lot.E-help-wantedCall for participation: Help is requested to fix this issue.Call for participation: Help is requested to fix this issue.T-libs-apiRelevant to the library API team, which will review and decide on the PR/issue.Relevant to the library API team, which will review and decide on the PR/issue.