small_db/utils/
other.rs

1use std::{
2    io::prelude::*,
3    ops::Deref,
4    sync::{RwLock, RwLockReadGuard, RwLockWriteGuard},
5};
6
7/// copy from https://github.com/tikv/tikv/blob/b15ea3b1cd766375cb52019e35c195ed797124df/components/tikv_util/src/lib.rs#L171-L186
8///
9/// A handy shortcut to replace `RwLock` write/read().unwrap() pattern
10/// to shortcut wl and rl.
11pub trait HandyRwLock<T: ?Sized> {
12    fn wl(&self) -> RwLockWriteGuard<'_, T>;
13    fn rl(&self) -> RwLockReadGuard<'_, T>;
14}
15
16impl<T: ?Sized> HandyRwLock<T> for RwLock<T> {
17    fn wl(&self) -> RwLockWriteGuard<'_, T> {
18        self.write().unwrap()
19    }
20
21    fn rl(&self) -> RwLockReadGuard<'_, T> {
22        self.read().unwrap()
23    }
24}
25
26pub use crate::{btree::tuple::small_int_schema, utils::init_log};
27
28pub fn lock_state<T>(lock: impl Deref<Target = RwLock<T>>) -> String {
29    let is_read: bool = lock.try_read().is_err();
30    let is_write: bool = lock.try_write().is_err();
31    let is_poisoned: bool = lock.is_poisoned();
32    format!("[r: {}, w: {}, p: {}]", is_read, is_write, is_poisoned)
33}