Skip to content

Commit

Permalink
Use AtomicBool instead of a 'static mut' for LLVM init posioning
Browse files Browse the repository at this point in the history
  • Loading branch information
Robin Kruppe committed May 15, 2017
1 parent e3f6e68 commit acdeedc
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions src/librustc_trans/llvm_util.rs
Expand Up @@ -16,23 +16,25 @@ use rustc::session::config::PrintRequest;
use libc::{c_int, c_char};
use std::ffi::CString;

use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Once;

pub fn init(sess: &Session) {
unsafe {
// Before we touch LLVM, make sure that multithreading is enabled.
use std::sync::Once;
static POISONED: AtomicBool = AtomicBool::new(false);
static INIT: Once = Once::new();
static mut POISONED: bool = false;
INIT.call_once(|| {
if llvm::LLVMStartMultithreaded() != 1 {
// use an extra bool to make sure that all future usage of LLVM
// cannot proceed despite the Once not running more than once.
POISONED = true;
POISONED.store(true, Ordering::SeqCst);
}

configure_llvm(sess);
});

if POISONED {
if POISONED.load(Ordering::SeqCst) {
bug!("couldn't enable multi-threaded LLVM");
}
}
Expand Down

0 comments on commit acdeedc

Please sign in to comment.