diff options
| author | Zeyla Hellyer <[email protected]> | 2017-10-10 20:08:11 -0700 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2017-10-10 20:08:11 -0700 |
| commit | 93e0a4215c915b98cf433ac6d0bcfbc60f0168ec (patch) | |
| tree | 727111506d1f89cd8a511b8b79c102131222421f /src/internal | |
| parent | Resume on resumable session invalidations (diff) | |
| download | serenity-93e0a4215c915b98cf433ac6d0bcfbc60f0168ec.tar.xz serenity-93e0a4215c915b98cf433ac6d0bcfbc60f0168ec.zip | |
Switch to parking_lot::{Mutex, RwLock}
Switch to the `parking_lot` crate's implementations of
`std::sync::Mutex` and `std::sync::RwLock`, which are more efficient.
A writeup on why `parking_lot` is more efficient can be read here:
<https://github.com/Amanieu/parking_lot>
Upgrade path:
Modify `mutex.lock().unwrap()` usage to `mutex.lock()` (not needing to
unwrap or handle a result), and
`rwlock.read().unwrap()`/`rwlock.write().unwrap()` usage to
`rwlock.read()` and `rwlock.write()`.
For example, modify:
```rust
use serenity::CACHE;
println!("{}", CACHE.read().unwrap().user.id);
```
to:
```rust
use serenity::CACHE;
println!("{}", CACHE.read().user.id);
```
Diffstat (limited to 'src/internal')
| -rw-r--r-- | src/internal/rwlock_ext.rs | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/internal/rwlock_ext.rs b/src/internal/rwlock_ext.rs index 8266cdf..6235370 100644 --- a/src/internal/rwlock_ext.rs +++ b/src/internal/rwlock_ext.rs @@ -1,3 +1,4 @@ +use parking_lot::RwLock as ParkingLotRwLock; use std::sync::{Arc, RwLock}; pub trait RwLockExt<T> { @@ -16,3 +17,15 @@ impl<T> RwLockExt<T> for Arc<RwLock<T>> { f(&mut w) } } + +impl<T> RwLockExt<T> for Arc<ParkingLotRwLock<T>> { + fn with<Y, F: Fn(&T) -> Y>(&self, f: F) -> Y { + let r = self.read(); + f(&r) + } + + fn with_mut<Y, F: FnMut(&mut T) -> Y>(&self, mut f: F) -> Y { + let mut w = self.write(); + f(&mut w) + } +} |