提交 dacf9ba0 编写于 作者: J John Kåre Alsaker

Make Session.injected_allocator and Session.allocator_kind thread-safe

上级 66488a50
...@@ -118,8 +118,8 @@ pub struct Session { ...@@ -118,8 +118,8 @@ pub struct Session {
/// The metadata::creader module may inject an allocator/panic_runtime /// The metadata::creader module may inject an allocator/panic_runtime
/// dependency if it didn't already find one, and this tracks what was /// dependency if it didn't already find one, and this tracks what was
/// injected. /// injected.
pub injected_allocator: Cell<Option<CrateNum>>, pub injected_allocator: Once<Option<CrateNum>>,
pub allocator_kind: Cell<Option<AllocatorKind>>, pub allocator_kind: Once<Option<AllocatorKind>>,
pub injected_panic_runtime: Cell<Option<CrateNum>>, pub injected_panic_runtime: Cell<Option<CrateNum>>,
/// Map from imported macro spans (which consist of /// Map from imported macro spans (which consist of
...@@ -1105,8 +1105,8 @@ pub fn build_session_( ...@@ -1105,8 +1105,8 @@ pub fn build_session_(
const_eval_stack_frame_limit: 100, const_eval_stack_frame_limit: 100,
const_eval_step_limit: 1_000_000, const_eval_step_limit: 1_000_000,
next_node_id: OneThread::new(Cell::new(NodeId::new(1))), next_node_id: OneThread::new(Cell::new(NodeId::new(1))),
injected_allocator: Cell::new(None), injected_allocator: Once::new(),
allocator_kind: Cell::new(None), allocator_kind: Once::new(),
injected_panic_runtime: Cell::new(None), injected_panic_runtime: Cell::new(None),
imported_macro_spans: OneThread::new(RefCell::new(HashMap::new())), imported_macro_spans: OneThread::new(RefCell::new(HashMap::new())),
incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)), incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)),
......
...@@ -823,6 +823,8 @@ fn inject_allocator_crate(&mut self, krate: &ast::Crate) { ...@@ -823,6 +823,8 @@ fn inject_allocator_crate(&mut self, krate: &ast::Crate) {
needs_allocator = needs_allocator || data.needs_allocator(self.sess); needs_allocator = needs_allocator || data.needs_allocator(self.sess);
}); });
if !needs_allocator { if !needs_allocator {
self.sess.injected_allocator.set(None);
self.sess.allocator_kind.set(None);
return return
} }
...@@ -842,6 +844,8 @@ fn inject_allocator_crate(&mut self, krate: &ast::Crate) { ...@@ -842,6 +844,8 @@ fn inject_allocator_crate(&mut self, krate: &ast::Crate) {
} }
} }
if !need_lib_alloc && !need_exe_alloc { if !need_lib_alloc && !need_exe_alloc {
self.sess.injected_allocator.set(None);
self.sess.allocator_kind.set(None);
return return
} }
...@@ -879,6 +883,7 @@ fn inject_allocator_crate(&mut self, krate: &ast::Crate) { ...@@ -879,6 +883,7 @@ fn inject_allocator_crate(&mut self, krate: &ast::Crate) {
}); });
if global_allocator.is_some() { if global_allocator.is_some() {
self.sess.allocator_kind.set(Some(AllocatorKind::Global)); self.sess.allocator_kind.set(Some(AllocatorKind::Global));
self.sess.injected_allocator.set(None);
return return
} }
...@@ -922,6 +927,9 @@ fn inject_allocator_crate(&mut self, krate: &ast::Crate) { ...@@ -922,6 +927,9 @@ fn inject_allocator_crate(&mut self, krate: &ast::Crate) {
}; };
let allocation_crate_data = exe_allocation_crate_data.or_else(|| { let allocation_crate_data = exe_allocation_crate_data.or_else(|| {
// No allocator was injected
self.sess.injected_allocator.set(None);
if attr::contains_name(&krate.attrs, "default_lib_allocator") { if attr::contains_name(&krate.attrs, "default_lib_allocator") {
// Prefer self as the allocator if there's a collision // Prefer self as the allocator if there's a collision
return None; return None;
......
...@@ -795,7 +795,7 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, ...@@ -795,7 +795,7 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
codegen_units.len()); codegen_units.len());
// Translate an allocator shim, if any // Translate an allocator shim, if any
let allocator_module = if let Some(kind) = tcx.sess.allocator_kind.get() { let allocator_module = if let Some(kind) = *tcx.sess.allocator_kind.get() {
unsafe { unsafe {
let llmod_id = "allocator"; let llmod_id = "allocator";
let (llcx, llmod) = let (llcx, llmod) =
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册