diff options
| author | Chayim Refael Friedman <chayimfr@gmail.com> | 2024-08-21 00:10:13 +0300 |
|---|---|---|
| committer | Jubilee Young <workingjubilee@gmail.com> | 2024-09-17 09:40:34 -0700 |
| commit | d0a2ca4867c15659e28ab9c3930b5df4e60afcb0 (patch) | |
| tree | 5b0492210781415f79f2dadfc63d68e842afcd0a /library/std/src/sys/sync | |
| parent | 5601d14249818d952da612fec481b7af3ed03a39 (diff) | |
| download | rust-d0a2ca4867c15659e28ab9c3930b5df4e60afcb0.tar.gz rust-d0a2ca4867c15659e28ab9c3930b5df4e60afcb0.zip | |
Implement ACP 429: add `Lazy{Cell,Lock}::get[_mut]` and `force_mut`
In the implementation of `force_mut`, I chose performance over safety. For `LazyLock` this isn't really a choice; the code has to be unsafe. But for `LazyCell`, we can have a full-safe implementation, but it will be a bit less performant, so I went with the unsafe approach.
Diffstat (limited to 'library/std/src/sys/sync')
| -rw-r--r-- | library/std/src/sys/sync/once/futex.rs | 9 | ||||
| -rw-r--r-- | library/std/src/sys/sync/once/no_threads.rs | 9 | ||||
| -rw-r--r-- | library/std/src/sys/sync/once/queue.rs | 9 |
3 files changed, 27 insertions, 0 deletions
diff --git a/library/std/src/sys/sync/once/futex.rs b/library/std/src/sys/sync/once/futex.rs index 2c8a054282b..25588a4217b 100644 --- a/library/std/src/sys/sync/once/futex.rs +++ b/library/std/src/sys/sync/once/futex.rs @@ -91,6 +91,15 @@ impl Once { } } + #[inline] + pub(crate) fn set_state(&mut self, new_state: ExclusiveState) { + *self.state_and_queued.get_mut() = match new_state { + ExclusiveState::Incomplete => INCOMPLETE, + ExclusiveState::Poisoned => POISONED, + ExclusiveState::Complete => COMPLETE, + }; + } + #[cold] #[track_caller] pub fn wait(&self, ignore_poisoning: bool) { diff --git a/library/std/src/sys/sync/once/no_threads.rs b/library/std/src/sys/sync/once/no_threads.rs index 12c1d9f5a6c..cdcffe790f5 100644 --- a/library/std/src/sys/sync/once/no_threads.rs +++ b/library/std/src/sys/sync/once/no_threads.rs @@ -55,6 +55,15 @@ impl Once { } } + #[inline] + pub(crate) fn set_state(&mut self, new_state: ExclusiveState) { + self.state.set(match new_state { + ExclusiveState::Incomplete => State::Incomplete, + ExclusiveState::Poisoned => State::Poisoned, + ExclusiveState::Complete => State::Complete, + }); + } + #[cold] #[track_caller] pub fn wait(&self, _ignore_poisoning: bool) { diff --git a/library/std/src/sys/sync/once/queue.rs b/library/std/src/sys/sync/once/queue.rs index 86f72c82008..17abaf0bf26 100644 --- a/library/std/src/sys/sync/once/queue.rs +++ b/library/std/src/sys/sync/once/queue.rs @@ -140,6 +140,15 @@ impl Once { } } + #[inline] + pub(crate) fn set_state(&mut self, new_state: ExclusiveState) { + *self.state_and_queue.get_mut() = match new_state { + ExclusiveState::Incomplete => ptr::without_provenance_mut(INCOMPLETE), + ExclusiveState::Poisoned => ptr::without_provenance_mut(POISONED), + ExclusiveState::Complete => ptr::without_provenance_mut(COMPLETE), + }; + } + #[cold] #[track_caller] pub fn wait(&self, ignore_poisoning: bool) { |
