remove sync::Once::call_once 'static
- [std: Rewrite the `sync` module71d4e77db8) (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.
This commit is contained in:
parent
4700e1188f
commit
0f3f292b4c
1 changed files with 6 additions and 6 deletions
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue