Skip to content

Commit 70de2e8

Browse files
committed
Make Mir::predecessors thread-safe
1 parent 8fd7d49 commit 70de2e8

File tree

2 files changed

+9
-9
lines changed

2 files changed

+9
-9
lines changed

src/librustc/mir/cache.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
use std::cell::{Ref, RefCell};
1211
use rustc_data_structures::indexed_vec::IndexVec;
12+
use rustc_data_structures::sync::{RwLock, ReadGuard};
1313
use rustc_data_structures::stable_hasher::{HashStable, StableHasher,
1414
StableHasherResult};
1515
use ich::StableHashingContext;
@@ -19,7 +19,7 @@ use rustc_serialize as serialize;
1919

2020
#[derive(Clone, Debug)]
2121
pub struct Cache {
22-
predecessors: RefCell<Option<IndexVec<BasicBlock, Vec<BasicBlock>>>>
22+
predecessors: RwLock<Option<IndexVec<BasicBlock, Vec<BasicBlock>>>>
2323
}
2424

2525

@@ -46,7 +46,7 @@ impl<'a> HashStable<StableHashingContext<'a>> for Cache {
4646
impl Cache {
4747
pub fn new() -> Self {
4848
Cache {
49-
predecessors: RefCell::new(None)
49+
predecessors: RwLock::new(None)
5050
}
5151
}
5252

@@ -55,12 +55,12 @@ impl Cache {
5555
*self.predecessors.borrow_mut() = None;
5656
}
5757

58-
pub fn predecessors(&self, mir: &Mir) -> Ref<IndexVec<BasicBlock, Vec<BasicBlock>>> {
58+
pub fn predecessors(&self, mir: &Mir) -> ReadGuard<IndexVec<BasicBlock, Vec<BasicBlock>>> {
5959
if self.predecessors.borrow().is_none() {
6060
*self.predecessors.borrow_mut() = Some(calculate_predecessors(mir));
6161
}
6262

63-
Ref::map(self.predecessors.borrow(), |p| p.as_ref().unwrap())
63+
ReadGuard::map(self.predecessors.borrow(), |p| p.as_ref().unwrap())
6464
}
6565
}
6666

src/librustc/mir/mod.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use util::ppaux;
3434
use std::slice;
3535
use hir::{self, InlineAsm};
3636
use std::borrow::{Cow};
37-
use std::cell::Ref;
37+
use rustc_data_structures::sync::ReadGuard;
3838
use std::fmt::{self, Debug, Formatter, Write};
3939
use std::{iter, mem, u32};
4040
use std::ops::{Index, IndexMut};
@@ -187,13 +187,13 @@ impl<'tcx> Mir<'tcx> {
187187
}
188188

189189
#[inline]
190-
pub fn predecessors(&self) -> Ref<IndexVec<BasicBlock, Vec<BasicBlock>>> {
190+
pub fn predecessors(&self) -> ReadGuard<IndexVec<BasicBlock, Vec<BasicBlock>>> {
191191
self.cache.predecessors(self)
192192
}
193193

194194
#[inline]
195-
pub fn predecessors_for(&self, bb: BasicBlock) -> Ref<Vec<BasicBlock>> {
196-
Ref::map(self.predecessors(), |p| &p[bb])
195+
pub fn predecessors_for(&self, bb: BasicBlock) -> ReadGuard<Vec<BasicBlock>> {
196+
ReadGuard::map(self.predecessors(), |p| &p[bb])
197197
}
198198

199199
#[inline]

0 commit comments

Comments
 (0)