Skip to content

std: Tidy up some unsafe impls for sync #22596

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 25, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions src/libstd/sync/condvar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,6 @@ use sync::{mutex, MutexGuard, PoisonError};
#[stable(feature = "rust1", since = "1.0.0")]
pub struct Condvar { inner: Box<StaticCondvar> }

unsafe impl Send for Condvar {}
unsafe impl Sync for Condvar {}

/// Statically allocated condition variables.
///
/// This structure is identical to `Condvar` except that it is suitable for use
Expand All @@ -83,9 +80,6 @@ pub struct StaticCondvar {
mutex: AtomicUsize,
}

unsafe impl Send for StaticCondvar {}
unsafe impl Sync for StaticCondvar {}

/// Constant initializer for a statically allocated condition variable.
#[unstable(feature = "std_misc",
reason = "may be merged with Condvar in the future")]
Expand Down
2 changes: 0 additions & 2 deletions src/libstd/sync/mutex.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,6 @@ pub struct StaticMutex {
poison: poison::Flag,
}

unsafe impl Sync for StaticMutex {}

/// An RAII implementation of a "scoped lock" of a mutex. When this structure is
/// dropped (falls out of scope), the lock will be unlocked.
///
Expand Down
7 changes: 2 additions & 5 deletions src/libstd/sync/once.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,9 @@
//! This primitive is meant to be used to run one-time initialization. An
//! example use case would be for initializing an FFI library.

use prelude::v1::*;

use isize;
use marker::Sync;
use mem::drop;
use ops::FnOnce;
use sync::atomic::{AtomicIsize, Ordering, ATOMIC_ISIZE_INIT};
use sync::{StaticMutex, MUTEX_INIT};

Expand All @@ -43,8 +42,6 @@ pub struct Once {
lock_cnt: AtomicIsize,
}

unsafe impl Sync for Once {}

/// Initialization value for static `Once` values.
#[stable(feature = "rust1", since = "1.0.0")]
pub const ONCE_INIT: Once = Once {
Expand Down
6 changes: 6 additions & 0 deletions src/libstd/sync/poison.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ use fmt;
use thread;

pub struct Flag { failed: UnsafeCell<bool> }

// This flag is only ever accessed with a lock previously held. Note that this
// a totally private structure.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"totally private" ... pub struct Flag. :P

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice ;)

unsafe impl Send for Flag {}
unsafe impl Sync for Flag {}

pub const FLAG_INIT: Flag = Flag { failed: UnsafeCell { value: false } };

impl Flag {
Expand Down
3 changes: 0 additions & 3 deletions src/libstd/sync/rwlock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,6 @@ pub struct StaticRwLock {
poison: poison::Flag,
}

unsafe impl Send for StaticRwLock {}
unsafe impl Sync for StaticRwLock {}

/// Constant initialization for a statically-initialized rwlock.
#[unstable(feature = "std_misc",
reason = "may be merged with RwLock in the future")]
Expand Down
6 changes: 5 additions & 1 deletion src/libstd/sys/unix/condvar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use prelude::v1::*;

use cell::UnsafeCell;
use libc;
use ptr;
use std::option::Option::{Some, None};
use sys::mutex::{self, Mutex};
use sys::time;
use sys::sync as ffi;
Expand All @@ -20,6 +21,9 @@ use num::{Int, NumCast};

pub struct Condvar { inner: UnsafeCell<ffi::pthread_cond_t> }

unsafe impl Send for Condvar {}
unsafe impl Sync for Condvar {}

pub const CONDVAR_INIT: Condvar = Condvar {
inner: UnsafeCell { value: ffi::PTHREAD_COND_INITIALIZER },
};
Expand Down
4 changes: 3 additions & 1 deletion src/libstd/sys/unix/mutex.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use prelude::v1::*;

use cell::UnsafeCell;
use marker::Sync;
use sys::sync as ffi;
use sys_common::mutex;

Expand All @@ -24,6 +25,7 @@ pub const MUTEX_INIT: Mutex = Mutex {
inner: UnsafeCell { value: ffi::PTHREAD_MUTEX_INITIALIZER },
};

unsafe impl Send for Mutex {}
unsafe impl Sync for Mutex {}

impl Mutex {
Expand Down
5 changes: 5 additions & 0 deletions src/libstd/sys/unix/rwlock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use prelude::v1::*;

use cell::UnsafeCell;
use sys::sync as ffi;

Expand All @@ -17,6 +19,9 @@ pub const RWLOCK_INIT: RWLock = RWLock {
inner: UnsafeCell { value: ffi::PTHREAD_RWLOCK_INITIALIZER },
};

unsafe impl Send for RWLock {}
unsafe impl Sync for RWLock {}

impl RWLock {
#[inline]
pub unsafe fn new() -> RWLock {
Expand Down
5 changes: 5 additions & 0 deletions src/libstd/sys/windows/condvar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use prelude::v1::*;

use cell::UnsafeCell;
use libc::{self, DWORD};
use os;
Expand All @@ -17,6 +19,9 @@ use time::Duration;

pub struct Condvar { inner: UnsafeCell<ffi::CONDITION_VARIABLE> }

unsafe impl Send for Condvar {}
unsafe impl Sync for Condvar {}

pub const CONDVAR_INIT: Condvar = Condvar {
inner: UnsafeCell { value: ffi::CONDITION_VARIABLE_INIT }
};
Expand Down
17 changes: 10 additions & 7 deletions src/libstd/sys/windows/mutex.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use marker::Sync;
use prelude::v1::*;

use cell::UnsafeCell;
use sys::sync as ffi;

Expand All @@ -18,6 +19,7 @@ pub const MUTEX_INIT: Mutex = Mutex {
inner: UnsafeCell { value: ffi::SRWLOCK_INIT }
};

unsafe impl Send for Mutex {}
unsafe impl Sync for Mutex {}

#[inline]
Expand All @@ -27,14 +29,15 @@ pub unsafe fn raw(m: &Mutex) -> ffi::PSRWLOCK {

// So you might be asking why we're using SRWLock instead of CriticalSection?
//
// 1. SRWLock is several times faster than CriticalSection according to benchmarks performed on both
// Windows 8 and Windows 7.
// 1. SRWLock is several times faster than CriticalSection according to
// benchmarks performed on both Windows 8 and Windows 7.
//
// 2. CriticalSection allows recursive locking while SRWLock deadlocks. The Unix implementation
// deadlocks so consistency is preferred. See #19962 for more details.
// 2. CriticalSection allows recursive locking while SRWLock deadlocks. The Unix
// implementation deadlocks so consistency is preferred. See #19962 for more
// details.
//
// 3. While CriticalSection is fair and SRWLock is not, the current Rust policy is there there are
// no guarantees of fairness.
// 3. While CriticalSection is fair and SRWLock is not, the current Rust policy
// is there there are no guarantees of fairness.

impl Mutex {
#[inline]
Expand Down
5 changes: 5 additions & 0 deletions src/libstd/sys/windows/rwlock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use prelude::v1::*;

use cell::UnsafeCell;
use sys::sync as ffi;

Expand All @@ -17,6 +19,9 @@ pub const RWLOCK_INIT: RWLock = RWLock {
inner: UnsafeCell { value: ffi::SRWLOCK_INIT }
};

unsafe impl Send for RWLock {}
unsafe impl Sync for RWLock {}

impl RWLock {
#[inline]
pub unsafe fn read(&self) {
Expand Down
27 changes: 27 additions & 0 deletions src/test/run-pass/std-sync-right-kind-impls.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use std::sync;

fn assert_both<T: Sync + Send>() {}

fn main() {
assert_both::<sync::StaticMutex>();
assert_both::<sync::StaticCondvar>();
assert_both::<sync::StaticRwLock>();
assert_both::<sync::Mutex<()>>();
assert_both::<sync::Condvar>();
assert_both::<sync::RwLock<()>>();
assert_both::<sync::Semaphore>();
assert_both::<sync::Barrier>();
assert_both::<sync::Arc<()>>();
assert_both::<sync::Weak<()>>();
assert_both::<sync::Once>();
}