fix(solc): make scoped reporter work in parallel (#1214)

* fix(solc): make scoped reporter work in parallel

* typo
This commit is contained in:
Matthias Seitz 2022-05-04 01:39:36 +02:00 committed by GitHub
parent c8c81b4905
commit 2304ed53ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 2 deletions

View File

@ -543,11 +543,20 @@ fn compile_parallel(
} }
} }
// need to get the currently installed reporter before installing the pool, otherwise each new
// thread in the pool will get initialized with the default value of the `thread_local!`'s
// localkey. This way we keep access to the reporter in the rayon pool
let scoped_report = report::get_default(|reporter| reporter.clone());
// start a rayon threadpool that will execute all `Solc::compile()` processes // start a rayon threadpool that will execute all `Solc::compile()` processes
let pool = rayon::ThreadPoolBuilder::new().num_threads(num_jobs).build().unwrap(); let pool = rayon::ThreadPoolBuilder::new().num_threads(num_jobs).build().unwrap();
let outputs = pool.install(move || { let outputs = pool.install(move || {
jobs.into_par_iter() jobs.into_par_iter()
.map(|(solc, version, input, actually_dirty)| { .map(move |(solc, version, input, actually_dirty)| {
// set the reporter on this thread
let _guard = report::set_scoped(&scoped_report);
tracing::trace!( tracing::trace!(
"calling solc `{}` {:?} with {} sources: {:?}", "calling solc `{}` {:?} with {} sources: {:?}",
version, version,

View File

@ -93,7 +93,7 @@ where
/// print custom messages to `stdout`. /// print custom messages to `stdout`.
/// ///
/// A `Reporter` is entirely passive and only listens to incoming "events". /// A `Reporter` is entirely passive and only listens to incoming "events".
pub trait Reporter: 'static { pub trait Reporter: 'static + std::fmt::Debug {
/// Callback invoked right before [`Solc::compile()`] is called /// Callback invoked right before [`Solc::compile()`] is called
/// ///
/// This contains the [Solc] its [Version] the complete [CompilerInput] and all files that /// This contains the [Solc] its [Version] the complete [CompilerInput] and all files that
@ -453,6 +453,7 @@ mod tests {
#[test] #[test]
fn scoped_reporter_works() { fn scoped_reporter_works() {
#[derive(Debug)]
struct TestReporter; struct TestReporter;
impl Reporter for TestReporter {} impl Reporter for TestReporter {}
@ -468,6 +469,7 @@ mod tests {
}); });
set_global_reporter(Report::new(BasicStdoutReporter::default())).unwrap(); set_global_reporter(Report::new(BasicStdoutReporter::default())).unwrap();
#[derive(Debug)]
struct TestReporter; struct TestReporter;
impl Reporter for TestReporter {} impl Reporter for TestReporter {}