Age | Commit message (Collapse) | Author |
|
The erl_prim_loader:get_modules/{2,3} functions were introduced in
cd283583f8. Unfortunately, while the functions worked correctly, there
was a bug in that many garbage maessages would be sent to the
erl_prim_loader process. The number of extra messages depended on
both the length of the code path and of the number of modules that
were fetched. The messages were ignored and ultimately discarded,
causing no harm except for a performance degradation and increase of
the heap size for the erl_prim_loader process.
The following functions were hit by the performance bug:
code:atomic_load/1
code:ensure_modules_loaded/1
code:prepare_loading/1
|
|
A bad directory in the path would prevent the run-time system
from starting:
$ echo >foobar
$ erl -pa foobar
{"init terminating in do_boot",{load_failed,[supervisor,kernel,gen_server,file_io_server,filename,file,erl_parse,error_logger,code_server,erl_lint,proc_lib,code,application_controller,application_master,gen_event,application,error_handler,lists,heart,gen,file_server,ets,erl_eval]}}
Crash dump is being written to: erl_crash.dump...done
init terminating in do_boot ()
The reason is that when attempting to read each of the BEAM files,
there would be an 'enotdir' error which
erl_prim_load:get_modules/2,3 assumed was a fatal error.
Update erl_prim_load:get_modules/2,3 to ignore any error and try
the next directory in the path.
Reported-by: http://bugs.erlang.org/browse/ERL-142
Reported-by: Michael Truog
|
|
* henrik/update-copyrightyear:
update copyright-year
|
|
Use erlang:prepare_loading/1 and erlang:finish_loading/1 to load
modules in parallel to potentially decrease start-up times.
|
|
|
|
When we are going to implement functions that can load many modules
at once, we don't the erl_prim_loader server to become a bottleneck.
Therefore, we need erl_prim_loader:get_modules/3 that can read many
BEAM files in parallel.
Note that we will not bother making reading from archive files
or using the inet loader efficient. That can be done later if it
turns out to be important.
|
|
Rename release_archives/0 to purge_archive_cache/0 to make it
clearer what it does and what it doesn't do. Also add a comment
about its intended purpose.
Note that release_archives/0 is not documented and is part of the
experimental archive feature. Furthermore, the only uses I could find
were in the test suite. I did not find any uses in the external
applications relx and rebar3 applications that are known to use
archives. Therefore, I think that the increased clarity is worth
the small risk of breaking code.
|
|
The timeout routine for efile was never called. While at it,
eliminate the n_timeouts field and simplify the logic.
|
|
prim_do_release_archives/3 can't make up its mind whether the
primary archive should be released or not. The key in the process
dictionary is kept, while #prim_state.primary_archive is cleared.
It seems that intent was the primary archive should be preserved,
because the function was intended to be called by a timeout routine
every sixth minute (it is not because of a bug in setting up
the timeout).
Therefore, rewrite the code to preserve the primary archive and
simplify it while at it. Also, rename prim_release_archives/1 to
prim_purge_cache/0 to make it clearer what it is doing.
|
|
The #prim_state.cache' field is unused. The actual cache is kept
in the process dictionary.
|
|
Part of the return value for string_match/3 is not used by
its only caller. Eliminate the unused part of the return value
and the accumulator argument for string_match().
|
|
We don't need absolute paths unless we are dealing with archives.
Since it is not free to turn a relative path absolute (we will need a
call to prim_file to fetch the current directory), it's better to
delay the call to absname/1 until we are sure it's needed.
|
|
|
|
The 'init' module fetches command line parameters and passes them
to erl_prim_loader:start/3.
The code can be simplified if 'init' calls a new
erl_prim_loader:start/0 function that itself fetches the necessary
command line parameters. Also remove the documentation for the start()
function, since it there is no way that it can be usefully called by
a user application.
While we are at it, also get rid of '-id' command line parameter,
which is fetched and stored but never actually used.
|
|
erl_prim_loader:get_files/2 was an optimization introduced before the
SMP emulator (that is, before R11). The idea was to use the async
threads in the efile driver to read multiple BEAM files from the disk
in parallel.
In a modern computer with the SMP emulator, loading a BEAM module
seems to be more time-consuming than reading it from disk. To optimize
loading we would need to load several modules in parallel. We could
modify get_files/2 so that it would support parallel loading, but it
is cleaner to first remove get_files/2 and then (in a future commit),
introduce new functions to support parallel loading.
|
|
|
|
The deep indentation makes loop/3 difficult to read and maintain.
Break out the request handling code into a separate function.
|
|
|
|
* lrascao/fix_bug_windows_directory_symlinks:
fix indentation, add comment describing windows symlink creation assumption
fix escript archive symlinked across drives
OTP-12155
OTP-12154
OTP-12153
|
|
|
|
This fixes a bug introduced in f11aabdc9fec593c31e6c4f3fa25c1707e9c35df where
filelib:eval_read_file_info/2 was made to use file:read_link_info/1 to never
follow symlinks. This fixed wildcard/1 but broke every other function using
eval_read_file_info/2.
Reported-by: Louis-Philippe Gauthier
Reported-by: Danil Zagoskin
|
|
real_path method used while prim loading archive files was not taking into account
the fact that windows directory symlinks can be across different drives
(eg. c:\tmp\test is a symlink to j:\tmp\test). when performing a path split the drive
precedes the symlink, but that has be rewritten also since it's different. This issue
never arises in Unix since obviously there are no drives
|
|
This port has support for both non-smp and smp.
It contains a new way to do io checking in which erts_poll_wait
receives the payload of the polled entity. This has implications
for all linked-in drivers.
|
|
Conflicts:
erts/preloaded/ebin/erl_prim_loader.beam
|
|
This function normalizes a path:
* convert atoms to strings
* flatten strings
* convert backslash to a forward slash
The bugfix is to only convert backslashes to forward slashes on
windows and not on any other platforms.
|
|
|
|
|
|
The fix affects list_dir and read_link. Raw filenames are now
never produced, just consumed even if +fnu or +fna is used on
Linux etc.
This also adds the options to get error return or error handler
warning messages with +fn{u|a}{i|w|e} as an option to erl.
This is still not documented and there needs to be other versions
of read_dir and read_link to facilitate reading of all types
of filenames and links.
A check that we will not change to an invalid directory is also needed.
|
|
Ports for operations that did not directly operate on a file (such
as listing the files in a directory) was always opened in a binary
mode, but there was still code that supported such port opened in
non-binary mode.
Since we are about to update the code reading directories, and we
don't want to bother we supporting non-binary ports, make sure that
we force the use of binary mode.
|
|
Conflicts:
erts/preloaded/ebin/erl_prim_loader.beam
|
|
When correcting OTP-10071, a new error was introduced in
erl_prim_loader. In order to improve ability to detect if a file was
inside the primary archive, all paths were flattened - i.e. "." and
".." were removed. This implementation had some faults, and it did not
take symlinks into account. This has been corrected.
|
|
|
|
* ta/prim_archive-reloading:
escript_SUITE: remove gratuitous space
[erts,kernel,stdlib] fix escript/primary archive reloading
Conflicts:
erts/preloaded/src/erl_prim_loader.erl
OTP-10151
|
|
This commit introduces no functional change. It only adds comments and
changes some function/variable names.
|
|
The following errors have been corrected:
* If primary archive was named "xxx", then a file in the same
directory named "xxxyyy" would be interpreted as a file named yyy
inside the archive.
* erl_prim_loader did not correctly create and normalize absolute
paths for primary archive and files inside it, so unless given with
exact same path files inside the archive would not be found. E.g. if
escript was started as /full/path/to/xxx then "./xxx/file" would not
be found since erl_prim_loader would try to match /full/path/to/xxx
with /full/path/to/./xxx. Same problem with ../.
* Depending on how the primary archive was built,
erl_prim_loader:list_dir/1 would sometimes return an empty string
inside the file list. This was a virtual element representing the
top directory of the archive. This has been removed.
Thanks to Tuncer Ayaz and Shunichi Shinohara for reporting and
co-authoring corrections.
|
|
If the mtime of an escript/primary archive file changes after being
added to the code path, correctly reload the archive and update the
cache.
The existing code didn't consider that it might be a zip archive and failed:
=ERROR REPORT==== 3-Aug-2011::09:21:21 ===
File operation error: bad_central_directory. Target:
/escript_archive/module.beam. Function: get_file. Process: code_server.
Thanks David Reid and Hakan Mattson.
|
|
|
|
|
|
The concat/1 function is now only used to append lists when
constructing filenames. Thus it is too general and the first
clause (that handles characters) will never be used.
We could just remove the clause that is never used, but then the
name 'concat' would be misleading and someone could use misuse it.
Therefore, replace concat/1 with the join/2 function that can only
be used for joining filename components.
|
|
|
|
An incorrect spec, rpc:yield/1, has been fixed.
|
|
|
|
|
|
For example, if an archive (app-vsn.ez) just contains an
app-vsn/ebin/mod.beam file, the file info for the app-vsn and
app-vsn/ebin directories are faked using the file info from the
archive file as origin. The virtual direcories can also be
listed. For short, the top directories are virtual if they does
not exist.
|
|
|