diff options
Diffstat (limited to 'erts/etc/common/erlc.c')
-rw-r--r-- | erts/etc/common/erlc.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/erts/etc/common/erlc.c b/erts/etc/common/erlc.c index b76f1bb3e0..2d2b463675 100644 --- a/erts/etc/common/erlc.c +++ b/erts/etc/common/erlc.c @@ -205,6 +205,7 @@ int wmain(int argc, wchar_t **wcargv) int main(int argc, char** argv) { #endif + int single_scheduler; int eargv_size; int eargc_base; /* How many arguments in the base of eargv. */ char* emulator; @@ -299,6 +300,8 @@ int main(int argc, char** argv) * Parse all command line switches. */ + single_scheduler = 1; + while (argc > 1) { /* @@ -308,6 +311,11 @@ int main(int argc, char** argv) source_file = "<no source>"; switch (argv[1][0]) { case '+': + if (strcmp(argv[1], "+native") == 0) { + /* HiPE makes good use of multiple schedulers, so we'll let it + * use the default number. */ + single_scheduler = 0; + } PUSH(argv[1]); break; case '-': @@ -370,6 +378,16 @@ int main(int argc, char** argv) argc--, argv++; } + /* The compile server benefits from multiple schedulers. */ + single_scheduler = single_scheduler && !use_server; + + if (single_scheduler) { + /* Limit ourselves to a single scheduler to save memory and avoid + * starving the system of threads when used in parallel builds (e.g. + * make -j64 on a 64-core system). */ + UNSHIFT("+S1"); + } + /* * Move up the commands for invoking the emulator and adjust eargv * accordingly. |