diff options
author | Richard Carlsson <[email protected]> | 2018-05-23 14:15:23 +0200 |
---|---|---|
committer | Richard Carlsson <[email protected]> | 2018-05-24 09:35:43 +0200 |
commit | f18549cf0ab10e553da0f4f839c72370a304c10f (patch) | |
tree | bb6bcc41c03cff2a9b747313f1be3c4729088b2c | |
parent | 066af3f1e603326cce1e63de89c35b71fed2e7cd (diff) | |
download | otp-f18549cf0ab10e553da0f4f839c72370a304c10f.tar.gz otp-f18549cf0ab10e553da0f4f839c72370a304c10f.tar.bz2 otp-f18549cf0ab10e553da0f4f839c72370a304c10f.zip |
Make erl_init.c pass the boot module to erl_init.beam
-rw-r--r-- | erts/emulator/beam/atom.names | 1 | ||||
-rw-r--r-- | erts/emulator/beam/erl_init.c | 25 | ||||
-rw-r--r-- | erts/preloaded/src/erl_init.erl | 11 |
3 files changed, 18 insertions, 19 deletions
diff --git a/erts/emulator/beam/atom.names b/erts/emulator/beam/atom.names index caf6b7627e..fb223d2a5d 100644 --- a/erts/emulator/beam/atom.names +++ b/erts/emulator/beam/atom.names @@ -236,6 +236,7 @@ atom eof atom eol atom Eq='=:=' atom Eqeq='==' +atom erl_init atom erl_tracer atom erlang atom erl_signal_server diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c index 61355dd03c..8f45fa6cf3 100644 --- a/erts/emulator/beam/erl_init.c +++ b/erts/emulator/beam/erl_init.c @@ -374,21 +374,19 @@ erl_init(int ncpu, } static Eterm -erl_first_process_otp(char* modname, void* code, unsigned size, int argc, char** argv) +erl_first_process_otp(char* mod_name, int argc, char** argv) { int i; - Eterm start_mod; Eterm args; Eterm res; Eterm* hp; Process parent; ErlSpawnOpts so; - Eterm env; - - start_mod = erts_atom_put((byte *) modname, sys_strlen(modname), ERTS_ATOM_ENC_LATIN1, 1); - if (erts_find_function(start_mod, am_start, 2, + Eterm boot_mod; + + if (erts_find_function(am_erl_init, am_start, 2, erts_active_code_ix()) == NULL) { - erts_exit(ERTS_ERROR_EXIT, "No function %s:start/2\n", modname); + erts_exit(ERTS_ERROR_EXIT, "No function erl_init:start/2\n"); } /* @@ -404,13 +402,13 @@ erl_first_process_otp(char* modname, void* code, unsigned size, int argc, char** args = CONS(hp, new_binary(&parent, (byte*)argv[i], len), args); hp += 2; } - env = new_binary(&parent, code, size); + boot_mod = erts_atom_put((byte *) mod_name, sys_strlen(mod_name), ERTS_ATOM_ENC_LATIN1, 1); args = CONS(hp, args, NIL); hp += 2; - args = CONS(hp, env, args); + args = CONS(hp, boot_mod, args); so.flags = erts_default_spo_flags|SPO_SYSTEM_PROC; - res = erl_create_process(&parent, start_mod, am_start, args, &so); + res = erl_create_process(&parent, am_erl_init, am_start, args, &so); erts_proc_unlock(&parent, ERTS_PROC_LOCK_MAIN); erts_cleanup_empty_process(&parent); return res; @@ -571,9 +569,7 @@ void erts_usage(void) erts_fprintf(stderr, " number of poll threads."); erts_fprintf(stderr, "-IOPt number set number of threads to be used to poll for I/O\n"); erts_fprintf(stderr, " as a percentage of the number of schedulers."); - - /* erts_fprintf(stderr, "-i module set the boot module (default init)\n"); */ - + erts_fprintf(stderr, "-i module set the boot module (default init)\n"); erts_fprintf(stderr, "-n[s|a|d] Control behavior of signals to ports\n"); erts_fprintf(stderr, " Note that this flag is deprecated!\n"); erts_fprintf(stderr, "-M<X> <Y> memory allocator switches,\n"); @@ -2221,8 +2217,7 @@ erl_start(int argc, char **argv) erts_initialized = 1; - erts_init_process_id = erl_first_process_otp("erl_init", NULL, 0, - boot_argc, boot_argv); + erts_init_process_id = erl_first_process_otp(init, boot_argc, boot_argv); { /* diff --git a/erts/preloaded/src/erl_init.erl b/erts/preloaded/src/erl_init.erl index 186a04a8e8..f43e060438 100644 --- a/erts/preloaded/src/erl_init.erl +++ b/erts/preloaded/src/erl_init.erl @@ -23,11 +23,14 @@ -export([start/2]). -%% This gets the boot arguments as expected by init:boot/1 +%% This gets the module name given by the +i option (default 'init') +%% and the list of command line arguments --spec start(_, term()) -> term(). -start(_Env, Argv) -> - run(init, boot, Argv). +-spec start(Mod, BootArgs) -> no_return() when + Mod :: module(), + BootArgs :: [binary()]. +start(Mod, BootArgs) -> + run(Mod, boot, BootArgs). run(M, F, A) -> case erlang:function_exported(M, F, 1) of |