diff options
Diffstat (limited to 'erts/emulator/beam/erl_init.c')
-rw-r--r-- | erts/emulator/beam/erl_init.c | 122 |
1 files changed, 89 insertions, 33 deletions
diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c index ef822dbe8c..2f2e48d3c0 100644 --- a/erts/emulator/beam/erl_init.c +++ b/erts/emulator/beam/erl_init.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1997-2022. All Rights Reserved. + * Copyright Ericsson AB 1997-2023. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,7 +37,6 @@ #include "erl_mseg.h" #include "erl_threads.h" #include "erl_hl_timer.h" -#include "erl_mtrace.h" #include "erl_printf_term.h" #include "erl_misc_utils.h" #include "packet_parser.h" @@ -53,6 +52,7 @@ #include "erl_osenv.h" #include "erl_proc_sig_queue.h" #include "beam_load.h" +#include "erl_global_literals.h" #include "jit/beam_asm.h" @@ -132,12 +132,6 @@ static int modified_sched_thread_suggested_stack_size = 0; Eterm erts_init_process_id = ERTS_INVALID_PID; -/* - * Note about VxWorks: All variables must be initialized by executable code, - * not by an initializer. Otherwise a new instance of the emulator will - * inherit previous values. - */ - extern void erl_crash_dump_v(char *, int, const char *, va_list); #ifdef __WIN32__ extern void ConNormalExit(void); @@ -168,7 +162,7 @@ int erts_initialized = 0; int H_MIN_SIZE; /* The minimum heap grain */ int BIN_VH_MIN_SIZE; /* The minimum binary virtual*/ -int H_MAX_SIZE; /* The maximum heap size */ +Uint H_MAX_SIZE; /* The maximum heap size */ int H_MAX_FLAGS; /* The maximum heap flags */ Uint32 erts_debug_flags; /* Debug flags. */ @@ -302,6 +296,17 @@ void erl_error(const char *fmt, va_list args) static int early_init(int *argc, char **argv); +static void init_constant_literals(void) { + Eterm* hp = erts_alloc_global_literal(ERTS_LIT_EMPTY_TUPLE, 2); + Eterm tuple; + hp[0] = make_arityval_zero(); + hp[1] = make_arityval_zero(); + tuple = make_tuple(hp); + erts_register_global_literal(ERTS_LIT_EMPTY_TUPLE, tuple); + ERTS_GLOBAL_LIT_EMPTY_TUPLE = + erts_get_global_literal(ERTS_LIT_EMPTY_TUPLE); +} + static void erl_init(int ncpu, int proc_tab_sz, @@ -315,6 +320,7 @@ erl_init(int ncpu, int node_tab_delete_delay, ErtsDbSpinCount db_spin_count) { + init_constant_literals(); erts_monitor_link_init(); erts_bif_unique_init(); erts_proc_sig_queue_init(); /* Must be after erts_bif_unique_init(); */ @@ -381,6 +387,7 @@ erl_init(int ncpu, packet_parser_init(); erl_nif_init(); erts_msacc_init(); + beamfile_init(); } static Eterm @@ -644,7 +651,7 @@ void erts_usage(void) #ifdef BEAMASM erts_fprintf(stderr, "-JDdump bool enable or disable dumping of generated assembly code for each module loaded\n"); - erts_fprintf(stderr, "-JPperf bool enable or disable support for perf on Linux\n"); + erts_fprintf(stderr, "-JPperf true|false|dump|map|fp|no_fp enable or disable support for perf on Linux\n"); erts_fprintf(stderr, "\n"); #endif @@ -656,6 +663,7 @@ void erts_usage(void) erts_fprintf(stderr, "\n"); erts_fprintf(stderr, "-pc <set> control what characters are considered printable (default latin1)\n"); + erts_fprintf(stderr, "-pad bool set default process async data (default false)\n"); erts_fprintf(stderr, "-P number set maximum number of processes on this node;\n"); erts_fprintf(stderr, " valid range is [%d-%d]\n", ERTS_MIN_PROCESSES, ERTS_MAX_PROCESSES); @@ -683,6 +691,7 @@ void erts_usage(void) erts_fprintf(stderr, " none | very_short | short | medium | long | very_long\n"); erts_fprintf(stderr, "-scl bool enable/disable compaction of scheduler load\n"); erts_fprintf(stderr, "-sct cput set cpu topology\n"); + erts_fprintf(stderr, "-ssrct skip reading cpu topology\n"); erts_fprintf(stderr, "-secio bool enable or disable eager check I/O scheduling\n"); #if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT_OPT erts_fprintf(stderr, "-sub bool enable or disable scheduler utilization balancing\n"); @@ -834,6 +843,7 @@ early_init(int *argc, char **argv) /* int decentralized_counter_groups; char envbuf[21]; /* enough for any 64-bit integer */ size_t envbufsz; + int skip_read_topology = 0; erts_save_emu_args(*argc, argv); @@ -973,7 +983,18 @@ early_init(int *argc, char **argv) /* } break; } - + case 's' : { + char *sub_param = argv[i]+2; + if (has_prefix("srct", sub_param)) { + /* skip reading cpu topology */ + skip_read_topology = 1; + } + else if (has_prefix("ct", sub_param)) { + /* cpu topology */ + skip_read_topology = 1; + } + break; + } case 'S' : if (argv[i][2] == 'P') { int ptot, ponln; @@ -1270,7 +1291,8 @@ early_init(int *argc, char **argv) /* max_reader_groups, &reader_groups, max_decentralized_counter_groups, - &decentralized_counter_groups); + &decentralized_counter_groups, + skip_read_topology); erts_flxctr_setup(decentralized_counter_groups); { erts_thr_late_init_data_t elid = ERTS_THR_LATE_INIT_DATA_DEF_INITER; @@ -1396,11 +1418,28 @@ erl_start(int argc, char **argv) erts_usage(); } erts_set_printable_characters(printable_chars); - break; - } else { - erts_fprintf(stderr, "%s unknown flag %s\n", argv[0], argv[i]); - erts_usage(); } + else { + char *sub_param = argv[i]+2; + if (has_prefix("ad", sub_param)) { + arg = get_arg(sub_param+2, argv[i+1], &i); + if (sys_strcmp("true", arg) == 0) { + erts_default_spo_flags |= SPO_ASYNC_DIST; + } + else if (sys_strcmp("false", arg) == 0) { + erts_default_spo_flags &= ~SPO_ASYNC_DIST; + } + else { + erts_fprintf(stderr, "bad async dist value %s\n", arg); + erts_usage(); + } + } + else { + erts_fprintf(stderr, "%s unknown flag %s\n", argv[0], argv[i]); + erts_usage(); + } + } + break; case 'f': if (!sys_strncmp(argv[i],"-fn",3)) { int warning_type = ERL_FILENAME_WARNING_WARNING; @@ -1603,8 +1642,11 @@ erl_start(int argc, char **argv) } VERBOSE(DEBUG_SYSTEM, ("using max heap log %d\n", H_MAX_FLAGS)); } else if (has_prefix("max", sub_param)) { + Sint hMaxSize; + char *rest; arg = get_arg(sub_param+3, argv[i+1], &i); - if ((H_MAX_SIZE = atoi(arg)) < 0) { + hMaxSize = ErtsStrToSint(arg, &rest, 10); + if (hMaxSize < 0 || hMaxSize > MAX_SMALL) { erts_fprintf(stderr, "bad max heap size %s\n", arg); erts_usage(); } @@ -1614,6 +1656,7 @@ erl_start(int argc, char **argv) arg, H_MIN_SIZE); erts_usage(); } + H_MAX_SIZE = hMaxSize; VERBOSE(DEBUG_SYSTEM, ("using max heap size %d\n", H_MAX_SIZE)); } else { /* backward compatibility */ @@ -1688,13 +1731,18 @@ erl_start(int argc, char **argv) #ifdef HAVE_LINUX_PERF_SUPPORT if (sys_strcmp(arg, "true") == 0) { - erts_jit_perf_support = BEAMASM_PERF_DUMP|BEAMASM_PERF_MAP; + erts_jit_perf_support |= BEAMASM_PERF_ENABLED; } else if (sys_strcmp(arg, "false") == 0) { - erts_jit_perf_support = 0; + erts_jit_perf_support &= ~BEAMASM_PERF_ENABLED; } else if (sys_strcmp(arg, "dump") == 0) { - erts_jit_perf_support = BEAMASM_PERF_DUMP; + erts_jit_perf_support |= BEAMASM_PERF_DUMP; } else if (sys_strcmp(arg, "map") == 0) { - erts_jit_perf_support = BEAMASM_PERF_MAP; + erts_jit_perf_support |= BEAMASM_PERF_MAP | + BEAMASM_PERF_FP; + } else if (sys_strcmp(arg, "fp") == 0) { + erts_jit_perf_support |= BEAMASM_PERF_FP; + } else if (sys_strcmp(arg, "no_fp") == 0) { + erts_jit_perf_support &= ~BEAMASM_PERF_FP; } else { erts_fprintf(stderr, "bad +JPperf support flag %s\n", arg); erts_usage(); @@ -1789,8 +1837,8 @@ erl_start(int argc, char **argv) errno = 0; port_tab_sz = strtol(arg, NULL, 10); if (errno != 0 - || port_tab_sz < ERTS_MIN_PROCESSES - || ERTS_MAX_PROCESSES < port_tab_sz) { + || port_tab_sz < ERTS_MIN_PORTS + || ERTS_MAX_PORTS < port_tab_sz) { erts_fprintf(stderr, "bad number of ports %s\n", arg); erts_usage(); } @@ -2099,6 +2147,9 @@ erl_start(int argc, char **argv) } erts_runq_supervision_interval = val; } + else if (has_prefix("srct", sub_param)) { + /* skip reading cpu topology, already handled */ + } else { erts_fprintf(stderr, "bad scheduling option %s\n", argv[i]); erts_usage(); @@ -2491,13 +2542,21 @@ erl_start(int argc, char **argv) __decl_noreturn void erts_thr_fatal_error(int err, const char *what) { const char *errstr = err ? strerror(err) : NULL; - erts_fprintf(stderr, - "Failed to %s: %s%s(%d)\n", - what, - errstr ? errstr : "", - errstr ? " " : "", - err); - abort(); + if (err == ENOMEM) { + erts_exit(ERTS_DUMP_EXIT, "Failed to %s: %s%s(%d)\n", + what, + errstr ? errstr : "", + errstr ? " " : "", + err); + } else { + erts_fprintf(stderr, + "Failed to %s: %s%s(%d)\n", + what, + errstr ? errstr : "", + errstr ? " " : "", + err); + abort(); + } } @@ -2551,9 +2610,6 @@ erts_exit_vv(int n, int flush_async, const char *fmt, va_list args1, va_list arg { system_cleanup(flush_async); - if (erts_mtrace_enabled) - erts_mtrace_exit((Uint32) n); - if (fmt != NULL && *fmt != '\0') erl_error(fmt, args2); /* Print error message. */ |