Age | Commit message (Collapse) | Author |
|
* sal/float_to_list_2/OTP-10752:
Text representation of a float formatted using given options.
|
|
* anders/diameter/registered/OTP-10442:
Add registered server names to app file
|
|
* siri/common_test/minor_test_fixes/OTP-10483:
[common_test] Extend timetrap time in ct_hooks_SUITE
[common_test] Avoid hanging ct@host node if crypto does not exist
[common_test] Changed call to publick_key to use documented interface
[common_test] Extend timeout values for slave nodes in ct_master_SUITE
[common_test] Extend valid interval for approximate timer values in tests
|
|
|
|
When using the async thread pool and compressed files, when
an efile driver port instance is shutdown, the efile_drv
stop callback closes the file descriptor (a gzFile instance
actually) - this is dangerous if at the same time there's
an async thread performing an operation against the file,
for example calling invoke_read(), which can result in a
segmentation fault, or calling invoke_close() which double
closes the gzFile and this in turn causes 2 consecutive calls
to driver_free() against same gzFile instance (resulting in
later unexpected crashes in erl_bestfit_alloc.c for example).
The following test program makes the emulator crash when using
the async thread pool:
-module(t2).
-export([t/1]).
t(N) ->
file:delete("foo.bar"),
% Use of 'compressed' option, for creating/writing the file,
% is irrelevant. It only matters when opening it later for
% reads - a non-compressed file open with the 'compressed'
% option goes through an internal gzFile handle (instead of
% a plain integer fd), just like a compressed file.
%{ok, Fd} = file:open("foo.bar", [raw, write, binary]),
{ok, Fd} = file:open("foo.bar", [raw, write, binary, compressed]),
ok = file:write(Fd, <<"qwerty">>),
ok = file:close(Fd),
Pid = spawn_link(fun() ->
process_flag(trap_exit, true),
loop(N)
end),
Ref = erlang:monitor(process, Pid),
receive
{'DOWN', Ref, _, _, _} ->
ok
end.
loop(0) ->
ok;
loop(N) ->
Server = self(),
Pid = spawn(fun() ->
{ok, Fd} = file:open("foo.bar", [read, raw, binary, compressed]),
Server ! continue,
% Comment the file:read/2 call to make the file:close/1 call much
% more likely to crash or end up causing efile_drv to close twice
% the fd (gzFile), which will make the emulator crash later in the
% best fit allocator (erl_bestfit_alloc.c).
_ = file:read(Fd, 5),
file:close(Fd)
end),
receive continue -> ok end,
exit(Pid, shutdown),
loop(N - 1).
Running this test when using the async thread pool:
shell> erl +A 4
Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:4:4] [async-threads:4] [hipe] [kernel-poll:false]
Eshell V5.9.3.1 (abort with ^G)
1> c(t2).
{ok,t2}
2> t2:t(500000).
Segmentation fault (core dumped)
When not using the async thread pool, there are no issues:
shell> erl
Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.9.3.1 (abort with ^G)
1> c(t2).
{ok,t2}
2> t2:t(500000).
ok
3>
An example stack trace when the crash happens because there's
an ongoing read operation is:
Thread 1 (Thread 0x7f021cf2c700 (LWP 10687)):
#0 updatewindow (strm=0x2691bf8, out=5) at zlib/inflate.c:338
#1 0x00000000005a2ba0 in inflate (strm=0x2691bf8, flush=0) at zlib/inflate.c:1141
#2 0x000000000055c46a in erts_gzread (file=0x2691bf8, buf=0x7f0215b29e80, len=5) at drivers/common/gzio.c:523
#3 0x00000000005849ef in invoke_read (data=0x26b2228) at drivers/common/efile_drv.c:1114
#4 0x000000000050adcb in async_main (arg=0x7f021bf5cf40) at beam/erl_async.c:488
#5 0x00000000005c21a0 in thr_wrapper (vtwd=0x7fff69c6ff10) at pthread/ethread.c:106
#6 0x00007f021c573e9a in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#7 0x00007f021c097cbd in clone () from /lib/x86_64-linux-gnu/libc.so.6
#8 0x0000000000000000 in ?? ()
And when there's an ongoing close operation when the driver
is stopped:
Thread 1 (Thread 0x7fe5f5654700 (LWP 747)):
#0 0x0000000000459b64 in bf_unlink_free_block (block=0x10b2a70, allctr=<optimized out>, flags=<optimized out>) at beam/erl_bestfit_alloc.c:792
#1 bf_unlink_free_block (flags=0, block=0x10b2a70, allctr=0x873380) at beam/erl_bestfit_alloc.c:822
#2 bf_get_free_block (allctr=0x873380, size=<optimized out>, cand_blk=<optimized out>, cand_size=<optimized out>, flags=0) at beam/erl_bestfit_alloc.c:869
#3 0x000000000044f0dd in mbc_alloc_block (alcu_flgsp=<synthetic pointer>, blk_szp=<synthetic pointer>, size=200, allctr=0x873380) at beam/erl_alloc_util.c:1198
#4 mbc_alloc (allctr=0x873380, size=200) at beam/erl_alloc_util.c:1345
#5 0x000000000045449b in do_erts_alcu_alloc (size=200, extra=0x873380, type=165) at beam/erl_alloc_util.c:3442
#6 erts_alcu_alloc_thr_pref (type=165, extra=<optimized out>, size=192) at beam/erl_alloc_util.c:3520
#7 0x000000000055c0bf in gz_open (mode=0x5d98b2 "rb", path=0x1103418 "foo.bar") at drivers/common/gzio.c:164
#8 erts_gzopen (path=0x1103418 "foo.bar", mode=0x5d98b2 "rb") at drivers/common/gzio.c:307
#9 0x0000000000584e47 in invoke_open (data=0x1103330) at drivers/common/efile_drv.c:1857
#10 0x000000000050adcb in async_main (arg=0x7fe5f698af80) at beam/erl_async.c:488
|
|
* rickard/r16/port-optimizations/OTP-10336:
Bump reductions also for immediate driver calls
Add 'port_count' and 'port_limit' to system_info/1 spec
Fix documentation
Replace use of deprecated functions in test cases
Replace use of driver_send_term() with erl_drv_send_term()
Conflicts:
erts/preloaded/ebin/erlang.beam
|
|
* fredrik/fix-dialyzer-warn-r16:
Removed deprecated functions
handle_pref_algs with correct return values
|
|
* fh/shell_history_search/OTP-10739:
Add search to Erlang shell's history
|
|
This reverts commit 750ecdea08fa5fa7e32b7f3019eed96c1699427e, reversing
changes made to 2cfa0466c3b3c7bd5e3621aff0f3e2ca30addb68.
|
|
* fredrik/fix-merge-dialyzer/R16:
Fixed merge issue
|
|
|
|
* bjorn/compiler/binary-syntax-bug/OTP-10724:
compiler: Eliminate internal consistency failure in binary matching
|
|
* sa/dialyzer-list-spec/OTP-10740:
Report spec discrepancy on mismatching lists
Properly support functions with arbitrary arity in type specs.
Conflicts:
lib/dialyzer/test/small_SUITE_data/results/empty_list_infimum
|
|
|
|
|
|
* sa/dialyzer-list-spec/OTP-10740:
Report spec discrepancy on mismatching lists
|
|
* fredrik/ssh/update_versions/R16:
Fixed some specs - ssh
Bumped version numbers
|
|
|
|
* ia/ssl/prepare-for-release:
ssl: Prepare for R16 release
|
|
* ae/stdlib/faster_queue/OTP-10722:
Fix bug in queue:out/1, queue:out_r/1 that makes it O(N^2) in worst case
|
|
Remove very old and obsolete release notes, update version and appup.
|
|
|
|
|
|
* ia/ssl/incompatible-error-msg/OTP-10451:
ssl: Enhance error handling
|
|
This was simply missed.
|
|
* lh/forget-mnemosyne/OTP-10729:
Remove what remains of the Mnemosyne code
Remove support for the query keyword and query expressions
|
|
* hb/type_corrections/OTP-10624:
[hipe, kernel, stdlib] Correct a few types
|
|
|
|
|
|
* fredrik/eldap/ssl-opts/OTP-10728:
Added doc for sslopts
Configure the SSL options fully
|
|
The type ascii_string() in the base64 module has been corrected.
The type file:file_info() has been cleaned up.
The type file:fd() has been made opaque in the documentation.
The type nodes() has been removed from erl_bif_types.erl.
|
|
* lukas/kernel/iter_max_socks_to_node/OTP-10734:
Isolate iter_max_socks to own node
|
|
This prevents this testcase from ruining the entire
testrun if it should fail critically.
|
|
This BIF solves a problem of float_to_list/1 that doesn't allow
specifying the number of digits after the decimal point when
formatting floats.
float_to_list(Float, Options) -> string()
Float = float()
Options = [Option]
Option = {decimals, Decimals::0..249} |
{scientific, Decimals::0..249} |
compact
Returns a string which corresponds to the text representation of
a `Float` formatted using given options.
When decimals option is specified the returned value will contain
at most `Decimals` number of digits past the decimal point.
When `compact` option is provided the trailing zeros at the end
of the list are truncated (this option is only meaningful together
with the `decimals` option). When `scientific` option is provided,
the float will be formatted using scientific notation with
`Decimals` digits of precision. If `Options` is `[]` the function
behaves like `float_to_list/1`. When using `decimals` option and
the number doesn't fit in the static internal buffer of 256 bytes
the function throws `badarg`.
|
|
* ia/ssl/certtable-clean/OTP-10710:
ssl: Certificates and PEM-cache cleaning fixed to avoid memory leak
|
|
* 'master' of super:otp:
Fixed specs
|
|
* fredrik/public_key/specs-r16/OTP-10723:
Fixed specs
|
|
|
|
|
|
|
|
|
|
|
|
* fredrik/ssh/ssh-internal-error/OTP-10731:
Fixed internal error on when client and server can not agree o which authmethod to use
|
|
* fredrik/ssh/port_in_use_error:
Fixed bug which lead to crash in startup of daemon, if port was in use
|
|
* ia/ssl/simplify-addition-of-keyexchange-algorithms/OTP-10709:
SSL: simplify server key encoding, decoding and signature handling
SSL: unify the different implementations signature check implementations
|
|
Remove filter mechanisms that made error messages backwards compatible
with old ssl but hid information about what actually happened.
This does not break the documented API however other reason
terms may be returned, so code that matches on the reason part of
{error, Reason} may fail.
|
|
* anders/diameter/length_error/OTP-10693:
More testcases in traffic suite
Test diameter_packet answers
Ensure correct setting of 3xxx result code
|
|
|
|
Search mode can be entered by pressing ctrl-r. Enter terms and press
ctrl-r again to search backwards, or ctrl-s to then search forward (if
you terminal doesn't eat up that one). Press enter to execute the line,
or use tab, arrow keys, or other control sequences (^D, ^K, etc.) to
exit search mode while remaining on the last found line. Exiting is also
possible by pressing the escape key twice.
The search mode is a simpler version of the one available in bash or
zsh shells.
This adds a few modes to the shell (search, on top of none and meta) in
group.erl for history search, and a few more in edlin.erl to change the
meaning of control sequences while searching.
|
|
|