diff options
author | Björn Gustavsson <[email protected]> | 2010-10-19 13:43:13 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2010-10-20 12:02:08 +0200 |
commit | 7f82eddfaa3b89f734b4d58f1de92db86e5880cf (patch) | |
tree | d006dcb6f6c022ee875b32e75415c3793eb9cb7a /lib/kernel/src/kernel.erl | |
parent | c09fa792fad151f43cd3fa3d998b666a91badc5e (diff) | |
download | otp-7f82eddfaa3b89f734b4d58f1de92db86e5880cf.tar.gz otp-7f82eddfaa3b89f734b4d58f1de92db86e5880cf.tar.bz2 otp-7f82eddfaa3b89f734b4d58f1de92db86e5880cf.zip |
Fix hang in on_load handlers in embedded mode
In embedded mode, all on_load handlers will be called after
loading all modules but before starting any servers. Therefore,
if an on_load handler calls any function in the code module that
calls the code server (such as code:priv_dir/1), there will be a
deadlock because the code server has not yet been started.
Fix this problem by invoking the on_load handlers after
having started most servers in the kernel application.
Diffstat (limited to 'lib/kernel/src/kernel.erl')
-rw-r--r-- | lib/kernel/src/kernel.erl | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/lib/kernel/src/kernel.erl b/lib/kernel/src/kernel.erl index 92ee7b441a..d3b0f6c712 100644 --- a/lib/kernel/src/kernel.erl +++ b/lib/kernel/src/kernel.erl @@ -143,6 +143,13 @@ init(safe) -> Boot = start_boot_server(), DiskLog = start_disk_log(), Pg2 = start_pg2(), + + %% Run the on_load handlers for all modules that have been + %% loaded so far. Running them at this point means that + %% on_load handlers can safely call kernel processes + %% (and in particular call code:priv_dir/1 or code:lib_dir/1). + init:run_on_load_handlers(), + {ok, {SupFlags, Boot ++ DiskLog ++ Pg2}}. get_code_args() -> |