mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-10-01 12:20:39 +00:00
sync: remove RwLockWriteGuard::map and RwLockWriteGuard::try_map (#3345)
This commit is contained in:
parent
1eefbc250a
commit
fe2664a4e1
@ -237,114 +237,6 @@ pub struct RwLockWriteGuard<'a, T: ?Sized> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, T: ?Sized> RwLockWriteGuard<'a, T> {
|
impl<'a, T: ?Sized> RwLockWriteGuard<'a, T> {
|
||||||
/// Make a new `RwLockWriteGuard` for a component of the locked data.
|
|
||||||
///
|
|
||||||
/// This operation cannot fail as the `RwLockWriteGuard` passed in already
|
|
||||||
/// locked the data.
|
|
||||||
///
|
|
||||||
/// This is an associated function that needs to be used as
|
|
||||||
/// `RwLockWriteGuard::map(..)`. A method would interfere with methods of
|
|
||||||
/// the same name on the contents of the locked data.
|
|
||||||
///
|
|
||||||
/// This is an asynchronous version of [`RwLockWriteGuard::map`] from the
|
|
||||||
/// [`parking_lot` crate].
|
|
||||||
///
|
|
||||||
/// [`RwLockWriteGuard::map`]: https://docs.rs/lock_api/latest/lock_api/struct.RwLockWriteGuard.html#method.map
|
|
||||||
/// [`parking_lot` crate]: https://crates.io/crates/parking_lot
|
|
||||||
///
|
|
||||||
/// # Examples
|
|
||||||
///
|
|
||||||
/// ```
|
|
||||||
/// use tokio::sync::{RwLock, RwLockWriteGuard};
|
|
||||||
///
|
|
||||||
/// #[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
||||||
/// struct Foo(u32);
|
|
||||||
///
|
|
||||||
/// # #[tokio::main]
|
|
||||||
/// # async fn main() {
|
|
||||||
/// let lock = RwLock::new(Foo(1));
|
|
||||||
///
|
|
||||||
/// {
|
|
||||||
/// let mut mapped = RwLockWriteGuard::map(lock.write().await, |f| &mut f.0);
|
|
||||||
/// *mapped = 2;
|
|
||||||
/// }
|
|
||||||
///
|
|
||||||
/// assert_eq!(Foo(2), *lock.read().await);
|
|
||||||
/// # }
|
|
||||||
/// ```
|
|
||||||
#[inline]
|
|
||||||
pub fn map<F, U: ?Sized>(mut this: Self, f: F) -> RwLockWriteGuard<'a, U>
|
|
||||||
where
|
|
||||||
F: FnOnce(&mut T) -> &mut U,
|
|
||||||
{
|
|
||||||
let data = f(&mut *this) as *mut U;
|
|
||||||
let s = this.s;
|
|
||||||
// NB: Forget to avoid drop impl from being called.
|
|
||||||
mem::forget(this);
|
|
||||||
RwLockWriteGuard {
|
|
||||||
s,
|
|
||||||
data,
|
|
||||||
marker: marker::PhantomData,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Attempts to make a new [`RwLockWriteGuard`] for a component of
|
|
||||||
/// the locked data. The original guard is returned if the closure returns
|
|
||||||
/// `None`.
|
|
||||||
///
|
|
||||||
/// This operation cannot fail as the `RwLockWriteGuard` passed in already
|
|
||||||
/// locked the data.
|
|
||||||
///
|
|
||||||
/// This is an associated function that needs to be
|
|
||||||
/// used as `RwLockWriteGuard::try_map(...)`. A method would interfere with
|
|
||||||
/// methods of the same name on the contents of the locked data.
|
|
||||||
///
|
|
||||||
/// This is an asynchronous version of [`RwLockWriteGuard::try_map`] from
|
|
||||||
/// the [`parking_lot` crate].
|
|
||||||
///
|
|
||||||
/// [`RwLockWriteGuard::try_map`]: https://docs.rs/lock_api/latest/lock_api/struct.RwLockWriteGuard.html#method.try_map
|
|
||||||
/// [`parking_lot` crate]: https://crates.io/crates/parking_lot
|
|
||||||
///
|
|
||||||
/// # Examples
|
|
||||||
///
|
|
||||||
/// ```
|
|
||||||
/// use tokio::sync::{RwLock, RwLockWriteGuard};
|
|
||||||
///
|
|
||||||
/// #[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
||||||
/// struct Foo(u32);
|
|
||||||
///
|
|
||||||
/// # #[tokio::main]
|
|
||||||
/// # async fn main() {
|
|
||||||
/// let lock = RwLock::new(Foo(1));
|
|
||||||
///
|
|
||||||
/// {
|
|
||||||
/// let guard = lock.write().await;
|
|
||||||
/// let mut guard = RwLockWriteGuard::try_map(guard, |f| Some(&mut f.0)).expect("should not fail");
|
|
||||||
/// *guard = 2;
|
|
||||||
/// }
|
|
||||||
///
|
|
||||||
/// assert_eq!(Foo(2), *lock.read().await);
|
|
||||||
/// # }
|
|
||||||
/// ```
|
|
||||||
#[inline]
|
|
||||||
pub fn try_map<F, U: ?Sized>(mut this: Self, f: F) -> Result<RwLockWriteGuard<'a, U>, Self>
|
|
||||||
where
|
|
||||||
F: FnOnce(&mut T) -> Option<&mut U>,
|
|
||||||
{
|
|
||||||
let data = match f(&mut *this) {
|
|
||||||
Some(data) => data as *mut U,
|
|
||||||
None => return Err(this),
|
|
||||||
};
|
|
||||||
let s = this.s;
|
|
||||||
// NB: Forget to avoid drop impl from being called.
|
|
||||||
mem::forget(this);
|
|
||||||
Ok(RwLockWriteGuard {
|
|
||||||
s,
|
|
||||||
data,
|
|
||||||
marker: marker::PhantomData,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Atomically downgrades a write lock into a read lock without allowing
|
/// Atomically downgrades a write lock into a read lock without allowing
|
||||||
/// any writers to take exclusive access of the lock in the meantime.
|
/// any writers to take exclusive access of the lock in the meantime.
|
||||||
///
|
///
|
||||||
|
Loading…
x
Reference in New Issue
Block a user