From cfb4e18ebac064facdb6ad2136f8f4970aced58a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lauren=C8=9Biu=20Nicola?= Date: Sat, 27 Jun 2020 13:30:38 +0300 Subject: [PATCH] Remove workaround for parking_lot#101 --- Cargo.toml | 1 + src/derived/slot.rs | 14 +++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 931b3a80..26b37390 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ readme = "README.md" [dependencies] crossbeam = "0.7.1" indexmap = "1.0.1" +lock_api = "0.4" log = "0.4.5" parking_lot = "0.11.0" rustc-hash = "1.0" diff --git a/src/derived/slot.rs b/src/derived/slot.rs index 83a2fd55..dfbee4fd 100644 --- a/src/derived/slot.rs +++ b/src/derived/slot.rs @@ -17,7 +17,7 @@ use crate::runtime::StampedValue; use crate::{CycleError, Database, DiscardIf, DiscardWhat, Event, EventKind, SweepStrategy}; use log::{debug, info}; use parking_lot::Mutex; -use parking_lot::RwLock; +use parking_lot::{RawRwLock, RwLock}; use smallvec::SmallVec; use std::marker::PhantomData; use std::ops::Deref; @@ -165,13 +165,13 @@ where // Check with an upgradable read to see if there is a value // already. (This permits other readers but prevents anyone // else from running `read_upgrade` at the same time.) - // - // FIXME(Amanieu/parking_lot#101) -- we are using a write-lock - // and not an upgradable read here because upgradable reads - // can sometimes encounter deadlocks. - let old_memo = match self.probe(db, self.state.write(), runtime, revision_now) { + let old_memo = match self.probe(db, self.state.upgradable_read(), runtime, revision_now) { ProbeState::UpToDate(v) => return v, - ProbeState::StaleOrAbsent(mut state) => { + ProbeState::StaleOrAbsent(state) => { + type RwLockUpgradableReadGuard<'a, T> = + lock_api::RwLockUpgradableReadGuard<'a, RawRwLock, T>; + + let mut state = RwLockUpgradableReadGuard::upgrade(state); match std::mem::replace(&mut *state, QueryState::in_progress(runtime.id())) { QueryState::Memoized(old_memo) => Some(old_memo), QueryState::InProgress { .. } => unreachable!(),