Multiple improvements to RwLocks · rust-lang/rust@ac470e9 (original) (raw)

`@@ -3,9 +3,7 @@ mod tests;

`

3

3

``

4

4

`use crate::cell::UnsafeCell;

`

5

5

`use crate::fmt;

`

6

``

`-

use crate::mem;

`

7

6

`use crate::ops::{Deref, DerefMut};

`

8

``

`-

use crate::ptr;

`

9

7

`use crate::sync::{poison, LockResult, TryLockError, TryLockResult};

`

10

8

`use crate::sys_common::rwlock as sys;

`

11

9

``

`@@ -66,7 +64,7 @@ use crate::sys_common::rwlock as sys;

`

66

64

`` /// [Mutex]: super::Mutex

``

67

65

`#[stable(feature = "rust1", since = "1.0.0")]

`

68

66

`pub struct RwLock<T: ?Sized> {

`

69

``

`-

inner: Boxsys::RWLock,

`

``

67

`+

inner: sys::MovableRWLock,

`

70

68

`poison: poison::Flag,

`

71

69

`data: UnsafeCell,

`

72

70

`}

`

`@@ -130,7 +128,7 @@ impl RwLock {

`

130

128

`#[stable(feature = "rust1", since = "1.0.0")]

`

131

129

`pub fn new(t: T) -> RwLock {

`

132

130

`RwLock {

`

133

``

`-

inner: box sys::RWLock::new(),

`

``

131

`+

inner: sys::MovableRWLock::new(),

`

134

132

`poison: poison::Flag::new(),

`

135

133

`data: UnsafeCell::new(t),

`

136

134

`}

`

`@@ -376,24 +374,8 @@ impl<T: ?Sized> RwLock {

`

376

374

`where

`

377

375

`T: Sized,

`

378

376

`{

`

379

``

`-

// We know statically that there are no outstanding references to

`

380

``

`` -

// self so there's no need to lock the inner lock.

``

381

``

`-

//

`

382

``

`` -

// To get the inner value, we'd like to call data.into_inner(),

``

383

``

`` -

// but because RwLock impl-s Drop, we can't move out of it, so

``

384

``

`-

// we'll have to destructure it manually instead.

`

385

``

`-

unsafe {

`

386

``

`` -

// Like let RwLock { inner, poison, data } = self.

``

387

``

`-

let (inner, poison, data) = {

`

388

``

`-

let RwLock { ref inner, ref poison, ref data } = self;

`

389

``

`-

(ptr::read(inner), ptr::read(poison), ptr::read(data))

`

390

``

`-

};

`

391

``

`-

mem::forget(self);

`

392

``

`` -

inner.destroy(); // Keep in sync with the Drop impl.

``

393

``

`-

drop(inner);

`

394

``

-

395

``

`-

poison::map_result(poison.borrow(), |_| data.into_inner())

`

396

``

`-

}

`

``

377

`+

let data = self.data.into_inner();

`

``

378

`+

poison::map_result(self.poison.borrow(), |_| data)

`

397

379

`}

`

398

380

``

399

381

`/// Returns a mutable reference to the underlying data.

`

`@@ -424,14 +406,6 @@ impl<T: ?Sized> RwLock {

`

424

406

`}

`

425

407

`}

`

426

408

``

427

``

`-

#[stable(feature = "rust1", since = "1.0.0")]

`

428

``

`-

unsafe impl<#[may_dangle] T: ?Sized> Drop for RwLock {

`

429

``

`-

fn drop(&mut self) {

`

430

``

`` -

// IMPORTANT: This code needs to be kept in sync with RwLock::into_inner.

``

431

``

`-

unsafe { self.inner.destroy() }

`

432

``

`-

}

`

433

``

`-

}

`

434

``

-

435

409

`#[stable(feature = "rust1", since = "1.0.0")]

`

436

410

`impl<T: ?Sized + fmt::Debug> fmt::Debug for RwLock {

`

437

411

`fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {

`