diff options
| author | Christopher Durham <cad97@cad97.com> | 2018-07-10 22:47:59 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-07-10 22:47:59 -0400 |
| commit | 0f3f292b4c7a15b656a925e7ebe5f2d3955b8553 (patch) | |
| tree | 6973f0d21fcb31e4d4eb70563f9ce44b76b71922 /src/libstd | |
| parent | 4700e1188f66fdb4086b7593416b678b8fe935f4 (diff) | |
| download | rust-0f3f292b4c7a15b656a925e7ebe5f2d3955b8553.tar.gz rust-0f3f292b4c7a15b656a925e7ebe5f2d3955b8553.zip | |
remove sync::Once::call_once 'static
- [std: Rewrite the `sync` modulehttps://github.com/rust-lang/rust/commit/71d4e77db8ad4b6d821da7e5d5300134ac95974e) (Nov 2014)
```diff
- pub fn doit(&self, f: ||) {
+ pub fn doit(&'static self, f: ||) {
```
> ```text
> The second layer is the layer provided by `std::sync` which is intended to be
> the thinnest possible layer on top of `sys_common` which is entirely safe to
> use. There are a few concerns which need to be addressed when making these
> system primitives safe:
>
> * Once used, the OS primitives can never be **moved**. This means that they
> essentially need to have a stable address. The static primitives use
> `&'static self` to enforce this, and the non-static primitives all use a
> `Box` to provide this guarantee.
> ```
The author of this diff is @alexcrichton. `sync::Once` contains only a pointer to (privately hidden) `Waiter`s, which are all stack-allocated. The `'static` bound to `sync::Once` is thus unnecessary to guarantee that any OS primitives are non-relocatable.
See https://internals.rust-lang.org/t/sync-once-per-instance/7918 for more context.Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/sync/once.rs | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/libstd/sync/once.rs b/src/libstd/sync/once.rs index 7eb7be23128..51c42995d5e 100644 --- a/src/libstd/sync/once.rs +++ b/src/libstd/sync/once.rs @@ -149,9 +149,9 @@ struct Waiter { // Helper struct used to clean up after a closure call with a `Drop` // implementation to also run on panic. -struct Finish { +struct Finish<'a> { panicked: bool, - me: &'static Once, + me: &'a Once, } impl Once { @@ -218,7 +218,7 @@ impl Once { /// /// [poison]: struct.Mutex.html#poisoning #[stable(feature = "rust1", since = "1.0.0")] - pub fn call_once<F>(&'static self, f: F) where F: FnOnce() { + pub fn call_once<F>(&self, f: F) where F: FnOnce() { // Fast path, just see if we've completed initialization. if self.state.load(Ordering::SeqCst) == COMPLETE { return @@ -275,7 +275,7 @@ impl Once { /// INIT.call_once(|| {}); /// ``` #[unstable(feature = "once_poison", issue = "33577")] - pub fn call_once_force<F>(&'static self, f: F) where F: FnOnce(&OnceState) { + pub fn call_once_force<F>(&self, f: F) where F: FnOnce(&OnceState) { // same as above, just with a different parameter to `call_inner`. if self.state.load(Ordering::SeqCst) == COMPLETE { return @@ -299,7 +299,7 @@ impl Once { // currently no way to take an `FnOnce` and call it via virtual dispatch // without some allocation overhead. #[cold] - fn call_inner(&'static self, + fn call_inner(&self, ignore_poisoning: bool, init: &mut FnMut(bool)) { let mut state = self.state.load(Ordering::SeqCst); @@ -390,7 +390,7 @@ impl fmt::Debug for Once { } } -impl Drop for Finish { +impl<'a> Drop for Finish<'a> { fn drop(&mut self) { // Swap out our state with however we finished. We should only ever see // an old state which was RUNNING. |
