diff options
| author | Jonas Schievink <jonasschievink@gmail.com> | 2020-09-25 19:42:28 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-09-25 19:42:28 +0200 |
| commit | a835af174cbfb2e480365c948071fc71fa319590 (patch) | |
| tree | 3bf5267c1eace765a5673c5e205e17126d55c948 /library/std/src/sync | |
| parent | 5b9e8864032a3bfefa6f69c33fd99e0383a414af (diff) | |
| parent | 26d6081f1d1a2005be87bbe47f6fcda270cfd016 (diff) | |
| download | rust-a835af174cbfb2e480365c948071fc71fa319590.tar.gz rust-a835af174cbfb2e480365c948071fc71fa319590.zip | |
Rollup merge of #76932 - fusion-engineering-forks:condvar-promise, r=sfackler
Relax promises about condition variable. For quite a while now, there have been plans to at some point use parking_lot or some other more efficient implementation of mutexes and condition variables. Right now, Mutex and CondVar both Box the 'real' mutex/condvar inside, to give it a stable address. This was done because implementations like pthread and Windows critical sections may not be moved. More efficient implementations based on futexes, WaitOnAddress, Windows SRW locks, parking_lot, etc. may be moved (while not borrowed), so wouldn't need boxing. However, not boxing them (which would be great goal to achieve), breaks a promise std currently makes about CondVar. CondVar promises to panic when used with different mutexes, to ensure consistent behaviour on all platforms. To this check, a mutex is considered 'the same' if the address of the 'real mutex' in the Box is the same. This address doesn't change when moving a `std::mutex::Mutex` object, effectively giving it an identity that survives moves of the Mutex object. If we ever switch to a non-boxed version, they no longer carry such an identity, and this check can no longer be made. Four options: 1. Always box mutexes. 2. Add a `MutexId` similar to `ThreadId`. Making mutexes bigger, and making it hard to ever have a `const fn new` for them. 3. Making the requirement of CondVar stricter: panic if the Mutex object itself moved. 4. Making the promise of CondVar weaker: don't promise to panic. 1, 2, and 3 seem like bad options. This PR updates the documentation for 4.
Diffstat (limited to 'library/std/src/sync')
| -rw-r--r-- | library/std/src/sync/condvar.rs | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/library/std/src/sync/condvar.rs b/library/std/src/sync/condvar.rs index bc01c26a86a..7e2155dae6f 100644 --- a/library/std/src/sync/condvar.rs +++ b/library/std/src/sync/condvar.rs @@ -78,13 +78,9 @@ impl WaitTimeoutResult { /// and a mutex. The predicate is always verified inside of the mutex before /// determining that a thread must block. /// -/// Functions in this module will block the current **thread** of execution and -/// are bindings to system-provided condition variables where possible. Note -/// that this module places one additional restriction over the system condition -/// variables: each condvar can be used with precisely one mutex at runtime. Any -/// attempt to use multiple mutexes on the same condition variable will result -/// in a runtime panic. If this is not desired, then the unsafe primitives in -/// `sys` do not have this restriction but may result in undefined behavior. +/// Functions in this module will block the current **thread** of execution. +/// Note that any attempt to use multiple mutexes on the same condition +/// variable may result in a runtime panic. /// /// # Examples /// @@ -159,10 +155,8 @@ impl Condvar { /// /// # Panics /// - /// This function will [`panic!`] if it is used with more than one mutex - /// over time. Each condition variable is dynamically bound to exactly one - /// mutex to ensure defined behavior across platforms. If this functionality - /// is not desired, then unsafe primitives in `sys` are provided. + /// This function may [`panic!`] if it is used with more than one mutex + /// over time. /// /// [`notify_one`]: Self::notify_one /// [`notify_all`]: Self::notify_all |
