Age | Commit message (Collapse) | Author |
|
* Refactor the code to make it easier to configure the benchmark
* Add a test case for long benchmark runs. The new test case is run by
the OTP-team's benchmark infrastructure and can help in keeping
track of how the performance of ETS is affected by code changes.
|
|
Allow list of chunks to be given to strip*()
OTP-15680
|
|
* 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)
|
|
* 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.
|
|
It's about the *last* time the table went from unfixed to fixed,
not the first time it ever did.
|
|
|
|
This allows extra chunks to be preserved for languages such as Elixir
|
|
into sverker/master/ets-no-mbuf-trapping/OTP-15660
|
|
into sverker/maint/ets-no-mbuf-trapping/OTP-15660
|
|
Many heap fragments do no longer make the GC slow.
Even worse, we are not guaranteed that a yield will provoke a GC
removing the fragments, which might lead to a one-yield-per-bucket
scenario if the heap fragment(s) still remains after each yield.
|
|
* maint:
stdlib: Correct and optimize pretty printing of strings
|
|
Avoid traversing all of the list/string when only part of it will be
used. An explicit check that the list is flat is needed since
string:slice() accepts deep lists and more.
|
|
|
|
* maint:
stdlib: Optimize calendar:system_time_to_rfc3339()
|
|
* hasse/stdlib/optimize_calendar_rfc3339/OTP-15630:
stdlib: Optimize calendar:system_time_to_rfc3339()
|
|
The stronger compiler optimizations made the test case fail.
|
|
5239eb0c62a9 removed some optimizations in `sys_core_fold`, and
because of that two warnings are no longer emitted.
|
|
This reverts commit df130102cdeca8d35fec95a0c926fd1cfec54eab.
|
|
|
|
OTP-15633
* siri/rsh-ssh/PR-1787:
Fix some missed comments about rsh
Document the restrictions on the -rsh command
Use ssh as the default remote shell
|
|
* solvip/stdlib/gen_statem/export-start-types:
Fix links within gen_statem doc
|
|
|
|
* solvip/stdlib/gen_statem/export-start-types:
Create a gen_statem type for enter_loop options
gen_statem exports types related to starting & naming
|
|
|
|
|
|
|
|
* maint:
Clarify the atomic guarantees for ets:update_counter()
|
|
The phrasing "no process can access the ETS table in the middle of the
operation" implies that the entire table is looked during
the operation, which is not true if `write_concurrency`
is enabled.
|
|
|
|
* maint:
stdlib: Fix a bug in the Erlang Pretty Printer
|
|
Not using io_lib for formatting makes the conversion several times
faster.
|
|
Long atom names in combination with <c><<>></c> could cause a crash.
|
|
* maint:
Updated OTP version
Prepare release
|
|
* maint-21:
Updated OTP version
Prepare release
|
|
* maint:
Update primary bootstrap
stdlib: Optimize formatted printing of terms
Conflicts:
bootstrap/lib/stdlib/ebin/io_lib.beam
bootstrap/lib/stdlib/ebin/io_lib_format.beam
bootstrap/lib/stdlib/ebin/io_lib_pretty.beam
|
|
maint
* hasse/stdlib/optimize_pretty_print/ERIERL-306/OTP-15573:
Update primary bootstrap
stdlib: Optimize formatted printing of terms
|
|
|
|
Add ETS docs about partially bound key traversal
|
|
|
|
|
|
Fix bug in binary:encode_unsigned causing a read of uninitialized memory
|
|
Try calling iolist_size() before calling string:length().
The reason is that calls to string:length/1 are slow when the argument
is not a list of integers (or contains UNICODE).
|
|
* maint:
Optimize calendar:gregorian_days_to_date/1
|
|
* FNickRU/stdlib/optimize_calendar/PR-2121/OTP-15572:
Optimize calendar:gregorian_days_to_date/1
|
|
Consider this pseudo code:
f(...) ->
Val = case Expr of
... ->
... ;
... ->
... ;
... ->
my_abort(something_went_wrong)
end,
%% Here follows code that uses Val.
.
.
.
my_abort(Reason) ->
throw({error,Reason}).
The first two clauses in the case will probably provide some
information about the type of the variable `Var`, information
that would be useful for optimizing the code that follows the
case.
However, the third clause would ruin everything. The call
to `my_abort/1` could return anything, and thus `Val` could
also have any type.
294d66a295f6 introduced module-level type analysis, which will in
general keep track of the return type of a local function
call. However, it does not improve the optimization for this specific
function. When a function never returns, that is, when its type is
`none`, it does not propagate the `none` type, but instead pretends
that the return type is `any`.
This commit extends the handling of functions that don't return to
properly handle the `none` type. Any instructions that directly
follows the function that does not return will be discarded, and the
call will be rewritten to a tail-recursive call.
For this specific example, it means that the type for `Val` deduced
from the first two clauses will be retained and can be used for
optimizing the code after the case.
|