Age | Commit message (Collapse) | Author |
|
|
|
|
|
|
|
|
|
|
|
* hans/crypto/fix_chacha20_bug/OTP-15678:
crypto: Disable chacha20 if OpenSSL 1.1.0-1.1.0c
|
|
* hans/crypto/fix_ret_bug_poly1305/OTP-15677:
crypto: Fix bug in error return for crypto:poly1305/2
|
|
* sverker/ets-select-fixation-owner-change-bug/OTP-15672:
erts: Fix bug for yielding ets:replace
|
|
Found by valgrind:
Conditional jump or move depends on uninitialised value(s)
Suspected: ets_select_replace_1:3034 [erl_db.c]
Bug introduced by already merged parent commit
0d550c80d4f19cc432e7de056169695d436c02a0.
|
|
due to a bug. The cipher first appeared in 1.1.0
|
|
Returned the atom notsup instead of the exception notsup.
|
|
Fixed a memory leak in the function for address infos encoding.
|
|
* sverker/ets-select-fixation-owner-change-bug/OTP-15672:
erts: Fix ets:select table fixation leak at owner change
erts: Refactor common things into traverse_context_t
stdlib: Clarify docs for ets:info(_, safe_fixed)
|
|
A debug printout in the socket_stop fucntion used the wrong
requestor record for the pid, which may leasd to a confusing
debug printout.
|
|
The activate-next (reader|writer|acceptor) always
*incorrectly* used the read select function.
This has now been changed so that the functions
are created via a macro with an argument specifying
which select function to use.
|
|
retranspissions -> retransmissions
|
|
|
|
Optimize tail-recursive calls of BIFs
OTP-15674
|
|
|
|
|
|
|
|
Update HOWTO for Raspberry Pi3 cross compilation
|
|
|
|
If a test case timed out, all processes created by it
should die. But because the 'evaluator' processes where
created with spawn_monitor, that was not the case, and
therefor, these processes could linger.
|
|
* maint:
Updated OTP version
Prepare release
|
|
Symtom:
ETS table remains fixed after finished ets:select* call.
Problem:
The decision to unfix table after a yielding ets:select*
is based on table ownership, but ownership might have changed
while ets:select* was yielding.
Solution:
Remember and pass along whether table was fixed
when the traversal started.
|
|
and rename it from match_callbacks_t.
|
|
It's about the *last* time the table went from unfixed to fixed,
not the first time it ever did.
|
|
* john/compiler/float-opt-guard-fix:
beam_ssa_opt: Fix crash in ssa_opt_float
|
|
|
|
|
|
Update instructions for macOS Mojave.
Change-Id: Ie59bf30845909dbe78ad83bf36fa95a8731d0fa7
|
|
BEAM currently does not call BIFs at the end of a function in a
tail-recursive way. That is, when calling a BIF at the end of a
function, the BIF is first called, and then the stack frame
is deallocated, and then control is transferred to the caller.
If there is no stack frame when a BIF is called in the tail position,
the loader will emit a sequence of three instructions: first an
instruction that allocates a stack frame and saves the continuation
pointer (`allocate`), then an instruction that calls the BIF
(`call_bif`), and lastly an instruction that deallocates the stack
frame and returns to the caller (`deallocate_return`).
The old compiler would essentially allocate a stack frame for each
clause in a function, so it would not be that common that a BIF was
called in the tail position when there was no stack frame, so the
three-instruction sequence was deemed acceptable.
The new compiler only allocates stack frames when truly needed, so
the three-instruction BIF call sequence has become much more common.
This commit introduces a new `call_bif_only` instruction so that only
one instruction will be needed when calling a BIF in the tail position
when there is no stack frame. This instruction is also used when there
is a stack frame to make it possible to deallocate the stack frame
**before** calling the BIF, which may make a subsequent garbage
collection at the end of the BIF call cheaper (copying less garbage).
The one downside of this change is that the function that called the
BIF will not be included in the stack backtrace (similar to how a
tail-recursive call to an Erlang function will not be included in the
backtrace).
That was the quick summary of the commit. Here comes a detailed look
at how BIF calls are translated by the loader. The first example is a
function that calls `setelement/3` in the tail position:
update_no_stackframe(X) ->
setelement(5, X, new_value).
Here is the BEAM code:
{function, update_no_stackframe, 1, 12}.
{label,11}.
{line,[...]}.
{func_info,{atom,t},{atom,update_no_stackframe},1}.
{label,12}.
{move,{x,0},{x,1}}.
{move,{atom,new_value},{x,2}}.
{move,{integer,5},{x,0}}.
{line,[...]}.
{call_ext_only,3,{extfunc,erlang,setelement,3}}.
Because there is no stack frame, the `call_ext_only` instruction will
be used to call `setelement/3`:
{call_ext_only,3,{extfunc,erlang,setelement,3}}.
The loader will transform this instruction to a three-instruction
sequence:
0000000020BD8130: allocate_tt 0 3
0000000020BD8138: call_bif_e erlang:setelement/3
0000000020BD8148: deallocate_return_Q 0
Using the `call_bif_only` instruction introduced in this commit,
only one instruction is needed:
000000005DC377F0: call_bif_only_e erlang:setelement/3
`call_bif_only` calls the BIF and returns to the caller.
Now let's look at a function that already has a stack frame when
`setelement/3` is called:
update_with_stackframe(X) ->
foobar(X),
setelement(5, X, new_value).
Here is the BEAM code:
{function, update_with_stackframe, 1, 14}.
{label,13}.
{line,[...]}.
{func_info,{atom,t},{atom,update_with_stackframe},1}.
{label,14}.
{allocate,1,1}.
{move,{x,0},{y,0}}.
{line,[...]}.
{call,1,{f,16}}.
{move,{y,0},{x,1}}.
{move,{atom,new_value},{x,2}}.
{move,{integer,5},{x,0}}.
{line,[...]}.
{call_ext_last,3,{extfunc,erlang,setelement,3},1}.
Since there is a stack frame, the `call_ext_last` instruction will be used
to deallocate the stack frame and call the function:
{call_ext_last,3,{extfunc,erlang,setelement,3},1}.
Before this commit, the loader would translate this instruction to:
0000000020BD81B8: call_bif_e erlang:setelement/3
0000000020BD81C8: deallocate_return_Q 1
That is, the BIF is called before deallocating the stack frame and returning
to the calling function.
After this commit, the loader will translate the `call_ext_last` like this:
000000005DC37868: deallocate_Q 1
000000005DC37870: call_bif_only_e erlang:setelement/3
There are still two instructions, but now the stack frame will be
deallocated before calling the BIF, which could make the potential
garbage collection after the BIF call slightly more efficient (copying
less garbage).
We could have introduced a `call_bif_last` instruction, but the code
for calling a BIF is relatively large and there does not seem be a
practical way to share the code between `call_bif` and `call_bif_only`
(since the difference is at the end, after the BIF call). Therefore,
we did not want to clone the BIF calling code yet another time to
make a `call_bif_last` instruction.
|
|
Clarify beam_load error message on file/module mismatch
|
|
* maint:
inets: Fix handling of erl_script_timeout
Change-Id: Ie6028000b0bd45307477d837f63c51b2620faaea
|
|
into maint
* peterdmv/inets/httpd_erl_script_timeout/ERIERL-321/OTP-15669:
inets: Fix handling of erl_script_timeout
Change-Id: I6a90408de48df6b8b01f44e0b273507bcec27b13
|
|
When httpd was started with 'erl_script_timeout', the value of the
option was converted to milliseconds before storage. Subsequent
calls to httpd:info/1 returned the input value multiplied by 1000.
This change fixes the handing of erl_script_timeout by storing the
timeout in seconds and converting it to milliseconds before usage.
Change-Id: Ic308d83b59ad0884e053f096f995754c89adcbf4
|
|
erts: Add enif_term_type
|
|
|
|
|
|
* rickard/deprecations-removals-fix:
Better erl_interface deprecation warning implementation
|
|
For reasons better explained in the source code, ssa_opt_float
skips optimizing inside guards but it failed to do so
consistently; while the pass never processed guard blocks, it was
still possible to erroneously defer error checking to a guard
block, crashing the compiler once it realized its state was
invalid.
|
|
This is particularly important in case insensitive filesystems,
where attempting to invoke a module with the wrong case leads
to confusing error messages:
1> erlpress_core:foo().
beam/beam_load.c(1428): Error loading module 'erlpress_core':
module name in object code is erlPress_core
Loading of erlPress_core.beam failed: :badfile
This commit replaces object code by BEAM file and improves
the readability of the message.
|
|
|
|
* sverker/master/ets-no-mbuf-trapping/OTP-15660:
erts: Remove ets traversal yielding if heap fragment
|
|
Add start_distribution to kernel environment
OTP-15668
|
|
* sverker/maint/ets-no-mbuf-trapping/OTP-15660:
erts: Remove ets traversal yielding if heap fragment
|
|
Tune BEAM instructions for the new compiler (part 2)
|
|
|
|
* anders/diameter/21.3/OTP-15654:
Update appup for diameter 2.2 in OTP 21.3
|