Make Session.injected_allocator and Session.allocator_kind thread-safe
This commit is contained in:
parent
66488a50f9
commit
dacf9ba00f
3 changed files with 13 additions and 5 deletions
|
@ -118,8 +118,8 @@ pub struct Session {
|
|||
/// The metadata::creader module may inject an allocator/panic_runtime
|
||||
/// dependency if it didn't already find one, and this tracks what was
|
||||
/// injected.
|
||||
pub injected_allocator: Cell<Option<CrateNum>>,
|
||||
pub allocator_kind: Cell<Option<AllocatorKind>>,
|
||||
pub injected_allocator: Once<Option<CrateNum>>,
|
||||
pub allocator_kind: Once<Option<AllocatorKind>>,
|
||||
pub injected_panic_runtime: Cell<Option<CrateNum>>,
|
||||
|
||||
/// Map from imported macro spans (which consist of
|
||||
|
@ -1105,8 +1105,8 @@ pub fn build_session_(
|
|||
const_eval_stack_frame_limit: 100,
|
||||
const_eval_step_limit: 1_000_000,
|
||||
next_node_id: OneThread::new(Cell::new(NodeId::new(1))),
|
||||
injected_allocator: Cell::new(None),
|
||||
allocator_kind: Cell::new(None),
|
||||
injected_allocator: Once::new(),
|
||||
allocator_kind: Once::new(),
|
||||
injected_panic_runtime: Cell::new(None),
|
||||
imported_macro_spans: OneThread::new(RefCell::new(HashMap::new())),
|
||||
incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)),
|
||||
|
|
|
@ -823,6 +823,8 @@ impl<'a> CrateLoader<'a> {
|
|||
needs_allocator = needs_allocator || data.needs_allocator(self.sess);
|
||||
});
|
||||
if !needs_allocator {
|
||||
self.sess.injected_allocator.set(None);
|
||||
self.sess.allocator_kind.set(None);
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -842,6 +844,8 @@ impl<'a> CrateLoader<'a> {
|
|||
}
|
||||
}
|
||||
if !need_lib_alloc && !need_exe_alloc {
|
||||
self.sess.injected_allocator.set(None);
|
||||
self.sess.allocator_kind.set(None);
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -879,6 +883,7 @@ impl<'a> CrateLoader<'a> {
|
|||
});
|
||||
if global_allocator.is_some() {
|
||||
self.sess.allocator_kind.set(Some(AllocatorKind::Global));
|
||||
self.sess.injected_allocator.set(None);
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -922,6 +927,9 @@ impl<'a> CrateLoader<'a> {
|
|||
};
|
||||
|
||||
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") {
|
||||
// Prefer self as the allocator if there's a collision
|
||||
return None;
|
||||
|
|
|
@ -795,7 +795,7 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
|||
codegen_units.len());
|
||||
|
||||
// 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 {
|
||||
let llmod_id = "allocator";
|
||||
let (llcx, llmod) =
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue