diff options
author | Erlang/OTP <[email protected]> | 2015-08-18 16:39:07 +0200 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2015-08-18 16:39:07 +0200 |
commit | 484cfe71b5457e251ca8f08c5a5648663961db6a (patch) | |
tree | 3d220d170e2cd28d6c75fdcc66567be50edfe30c /lib | |
parent | 99461fca5e224cda77174bb1b5ccee47969e9874 (diff) | |
parent | ba8740af39b7d4c612b2ee55e3bad6fbdcaf1418 (diff) | |
download | otp-484cfe71b5457e251ca8f08c5a5648663961db6a.tar.gz otp-484cfe71b5457e251ca8f08c5a5648663961db6a.tar.bz2 otp-484cfe71b5457e251ca8f08c5a5648663961db6a.zip |
Merge branch 'vinoski/stderr-eagain/OTP-12942' into maint-18
* vinoski/stderr-eagain/OTP-12942:
Handle ERRNO_BLOCK in fd_driver async functions
Diffstat (limited to 'lib')
-rw-r--r-- | lib/kernel/test/standard_error_SUITE.erl | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/lib/kernel/test/standard_error_SUITE.erl b/lib/kernel/test/standard_error_SUITE.erl index e8917bbd47..97ead9b9fd 100644 --- a/lib/kernel/test/standard_error_SUITE.erl +++ b/lib/kernel/test/standard_error_SUITE.erl @@ -21,13 +21,13 @@ -module(standard_error_SUITE). -export([all/0,suite/0]). --export([badarg/1,getopts/1]). +-export([badarg/1,getopts/1,output/1]). suite() -> [{ct_hooks,[ts_install_cth]}]. all() -> - [badarg,getopts]. + [badarg,getopts,output]. badarg(Config) when is_list(Config) -> {'EXIT',{badarg,_}} = (catch io:put_chars(standard_error, [oops])), @@ -37,3 +37,30 @@ badarg(Config) when is_list(Config) -> getopts(Config) when is_list(Config) -> [{encoding,latin1}] = io:getopts(standard_error), ok. + +%% Test that writing a lot of output to standard_error does not cause the +%% processes handling it to terminate like this: +%% +%% =ERROR REPORT==== 9-Aug-2015::23:19:23 === +%% ** Generic server standard_error_sup terminating +%% ** Last message in was {'EXIT',<0.28.0>,eagain} +%% ** When Server state == {state,standard_error,undefined,<0.28.0>, +%% {local,standard_error_sup}} +%% ** Reason for termination == +%% ** eagain +%% +%% This problem, observed with Erlang 18.0.2, was fixed in fd_driver by +%% properly handling EAGAIN if it arises on file descriptor writes. +%% +output(Config) when is_list(Config) -> + Ref = monitor(process, standard_error_sup), + Chars = [ [["1234567890" || _ <- lists:seq(1,10)], $\s, + integer_to_list(L), $\r, $\n] || L <- lists:seq(1, 100) ], + ok = io:put_chars(standard_error, Chars), + receive + {'DOWN', Ref, process, _, _} -> + error(standard_error_noproc) + after + 500 -> + ok + end. |