Make Steal thread-safe
This commit is contained in:
parent
962a53d474
commit
5d128cdca8
2 changed files with 7 additions and 7 deletions
|
|
@ -8,7 +8,7 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use std::cell::{Ref, RefCell};
|
||||
use rustc_data_structures::sync::{RwLock, ReadGuard};
|
||||
use std::mem;
|
||||
|
||||
/// The `Steal` struct is intended to used as the value for a query.
|
||||
|
|
@ -32,25 +32,25 @@ use std::mem;
|
|||
///
|
||||
/// FIXME(#41710) -- what is the best way to model linear queries?
|
||||
pub struct Steal<T> {
|
||||
value: RefCell<Option<T>>
|
||||
value: RwLock<Option<T>>
|
||||
}
|
||||
|
||||
impl<T> Steal<T> {
|
||||
pub fn new(value: T) -> Self {
|
||||
Steal {
|
||||
value: RefCell::new(Some(value))
|
||||
value: RwLock::new(Some(value))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn borrow(&self) -> Ref<T> {
|
||||
Ref::map(self.value.borrow(), |opt| match *opt {
|
||||
pub fn borrow(&self) -> ReadGuard<T> {
|
||||
ReadGuard::map(self.value.borrow(), |opt| match *opt {
|
||||
None => bug!("attempted to read from stolen value"),
|
||||
Some(ref v) => v
|
||||
})
|
||||
}
|
||||
|
||||
pub fn steal(&self) -> T {
|
||||
let value_ref = &mut *self.value.borrow_mut();
|
||||
let value_ref = &mut *self.value.try_write().expect("stealing value which is locked");
|
||||
let value = mem::replace(value_ref, None);
|
||||
value.expect("attempt to read from stolen value")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -128,7 +128,7 @@ fn borrowck<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, owner_def_id: DefId)
|
|||
// Note that `mir_validated` is a "stealable" result; the
|
||||
// thief, `optimized_mir()`, forces borrowck, so we know that
|
||||
// is not yet stolen.
|
||||
tcx.mir_validated(owner_def_id).borrow();
|
||||
ty::maps::queries::mir_validated::ensure(tcx, owner_def_id);
|
||||
|
||||
// option dance because you can't capture an uninitialized variable
|
||||
// by mut-ref.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue