diff options
| author | kennytm <kennytm@gmail.com> | 2017-11-07 15:52:10 +0800 |
|---|---|---|
| committer | kennytm <kennytm@gmail.com> | 2017-11-07 22:40:12 +0800 |
| commit | eae36714dff92b1c149bb48d3f6ecb515c9c0470 (patch) | |
| tree | e9d93bb994ae6fb7db7c5cd59c18c28b905fbd4a /src/libstd | |
| parent | 843dc4bd76a337ae8fd49ea3edf619e781aa2cb1 (diff) | |
| parent | 71534c45cc4e850c4265bc1c2491a522583e1185 (diff) | |
| download | rust-eae36714dff92b1c149bb48d3f6ecb515c9c0470.tar.gz rust-eae36714dff92b1c149bb48d3f6ecb515c9c0470.zip | |
Rollup merge of #45682 - RalfJung:rwlock-guards, r=alexcrichton
RwLock guards are Sync if T is
Currently, the compiler requires `T` to also be `Send`. There is no reason for
that. `&Rw{Read,Write}LockGuard` only provides a shared referenced to `T`, sending
that across threads is safe if `T` is `Sync`.
Cc @oconnor663
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/sync/rwlock.rs | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/libstd/sync/rwlock.rs b/src/libstd/sync/rwlock.rs index 5555f364e6e..d59a0b65a69 100644 --- a/src/libstd/sync/rwlock.rs +++ b/src/libstd/sync/rwlock.rs @@ -10,7 +10,6 @@ use cell::UnsafeCell; use fmt; -use marker; use mem; use ops::{Deref, DerefMut}; use ptr; @@ -102,7 +101,10 @@ pub struct RwLockReadGuard<'a, T: ?Sized + 'a> { } #[stable(feature = "rust1", since = "1.0.0")] -impl<'a, T: ?Sized> !marker::Send for RwLockReadGuard<'a, T> {} +impl<'a, T: ?Sized> !Send for RwLockReadGuard<'a, T> {} + +#[stable(feature = "rwlock_guard_sync", since = "1.23.0")] +unsafe impl<'a, T: ?Sized + Sync> Sync for RwLockReadGuard<'a, T> {} /// RAII structure used to release the exclusive write access of a lock when /// dropped. @@ -121,7 +123,10 @@ pub struct RwLockWriteGuard<'a, T: ?Sized + 'a> { } #[stable(feature = "rust1", since = "1.0.0")] -impl<'a, T: ?Sized> !marker::Send for RwLockWriteGuard<'a, T> {} +impl<'a, T: ?Sized> !Send for RwLockWriteGuard<'a, T> {} + +#[stable(feature = "rwlock_guard_sync", since = "1.23.0")] +unsafe impl<'a, T: ?Sized + Sync> Sync for RwLockWriteGuard<'a, T> {} impl<T> RwLock<T> { /// Creates a new instance of an `RwLock<T>` which is unlocked. |
