diff options
| author | Corey Farwell <coreyf@rwell.org> | 2017-02-08 10:19:54 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-02-08 10:19:54 -0500 |
| commit | 765892126773c9b9e05bbe7a833d7fd5c262f13c (patch) | |
| tree | 1a4dfd98fc8da76ed098a384948d5db0ea46b022 /src | |
| parent | 944933ef4e81abd6048287b2c257e883c04f7757 (diff) | |
| parent | fa0a728ed60586a9b5d3e7dc755c03c4424ea79b (diff) | |
Rollup merge of #39583 - michaelwoerister:limit-llvm-threads, r=nikomatsakis
back: Limit the number of LLVM worker threads. This should fix issue https://github.com/rust-lang/rust/issues/39568. Also see https://github.com/rust-lang/rust/issues/39280. r? @nikomatsakis
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_trans/back/write.rs | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/librustc_trans/back/write.rs b/src/librustc_trans/back/write.rs index b3a2d66a07c..9a761e17e75 100644 --- a/src/librustc_trans/back/write.rs +++ b/src/librustc_trans/back/write.rs @@ -27,6 +27,7 @@ use errors::emitter::Emitter; use syntax_pos::MultiSpan; use context::{is_pie_binary, get_reloc_model}; +use std::cmp; use std::ffi::CString; use std::fs; use std::path::{Path, PathBuf}; @@ -754,10 +755,13 @@ pub fn run_passes(sess: &Session, } // Process the work items, optionally using worker threads. - // NOTE: This code is not really adapted to incremental compilation where - // the compiler decides the number of codegen units (and will - // potentially create hundreds of them). - let num_workers = work_items.len() - 1; + // NOTE: We are hardcoding a limit of worker threads for now. With + // incremental compilation we can run into situations where we would + // open hundreds of threads otherwise -- which can make things slower + // if things don't fit into memory anymore, or can cause the compiler + // to crash because of too many open file handles. See #39280 for + // some discussion on how to improve this in the future. + let num_workers = cmp::min(work_items.len() - 1, 32); if num_workers <= 1 { run_work_singlethreaded(sess, &trans.exported_symbols, work_items); } else { |
