diff options
| author | 许杰友 Jieyou Xu (Joe) <39484203+jieyouxu@users.noreply.github.com> | 2024-11-25 00:39:03 +0800 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-25 00:39:03 +0800 | 
| commit | 31b4023e24e82c7c0ca6b9637de1b14d46d02b92 (patch) | |
| tree | 6151658caf22a6b98e10c622d684094c5492fdc6 /library/std/src/sync/mpmc/zero.rs | |
| parent | f5d18576856ef45d1e47de79889ae7db9d1afa29 (diff) | |
| parent | 5a856b82f3a1bf335e0e62d92c800d8436977af1 (diff) | |
| download | rust-31b4023e24e82c7c0ca6b9637de1b14d46d02b92.tar.gz rust-31b4023e24e82c7c0ca6b9637de1b14d46d02b92.zip | |
Rollup merge of #132730 - joboet:after_main_sync, r=Noratrieb
std: allow after-main use of synchronization primitives By creating an unnamed thread handle when the actual one has already been destroyed, synchronization primitives using thread parking can be used even outside the Rust runtime. This also fixes an inefficiency in the queue-based `RwLock`: if `thread::current` was not initialized yet, it will create a new handle on every parking attempt without initializing `thread::current`. The private `current_or_unnamed` function introduced here fixes this.
Diffstat (limited to 'library/std/src/sync/mpmc/zero.rs')
| -rw-r--r-- | library/std/src/sync/mpmc/zero.rs | 6 | 
1 files changed, 4 insertions, 2 deletions
| diff --git a/library/std/src/sync/mpmc/zero.rs b/library/std/src/sync/mpmc/zero.rs index 446881291e6..577997c07a6 100644 --- a/library/std/src/sync/mpmc/zero.rs +++ b/library/std/src/sync/mpmc/zero.rs @@ -190,7 +190,8 @@ impl<T> Channel<T> { drop(inner); // Block the current thread. - let sel = cx.wait_until(deadline); + // SAFETY: the context belongs to the current thread. + let sel = unsafe { cx.wait_until(deadline) }; match sel { Selected::Waiting => unreachable!(), @@ -257,7 +258,8 @@ impl<T> Channel<T> { drop(inner); // Block the current thread. - let sel = cx.wait_until(deadline); + // SAFETY: the context belongs to the current thread. + let sel = unsafe { cx.wait_until(deadline) }; match sel { Selected::Waiting => unreachable!(), | 
