diff options
author | Sverker Eriksson <[email protected]> | 2010-04-28 20:24:48 +0200 |
---|---|---|
committer | Raimo Niskanen <[email protected]> | 2010-05-24 15:08:41 +0200 |
commit | cb42b3d86e131f6d3ba883055990bb4164e0d6a6 (patch) | |
tree | 84f04e25c1355d08ee217ee72b0a5fd0145b7487 /erts/emulator/test | |
parent | 458dcb10f98bffd241a837cbac7c108eb485f706 (diff) | |
download | otp-cb42b3d86e131f6d3ba883055990bb4164e0d6a6.tar.gz otp-cb42b3d86e131f6d3ba883055990bb4164e0d6a6.tar.bz2 otp-cb42b3d86e131f6d3ba883055990bb4164e0d6a6.zip |
Fix deadlock in spawn driver on windows
A misbehaving port program that does not read all data written to the port
may deadlock the scheduler thread when it calls port_close. The chosen solution
was to use the new function CancelIoEx if it exist (Vista) otherwise let the
spawn driver wait for a short while (10ms) and then to spawn a thread that will
wait for the port program to exit.
Diffstat (limited to 'erts/emulator/test')
-rw-r--r-- | erts/emulator/test/port_SUITE.erl | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/erts/emulator/test/port_SUITE.erl b/erts/emulator/test/port_SUITE.erl index eb69bf917b..66aff307a3 100644 --- a/erts/emulator/test/port_SUITE.erl +++ b/erts/emulator/test/port_SUITE.erl @@ -88,7 +88,7 @@ otp_3906/1, otp_4389/1, win_massive/1, win_massive_client/1, mix_up_ports/1, otp_5112/1, otp_5119/1, otp_6224/1, exit_status_multi_scheduling_block/1, ports/1, - spawn_driver/1,spawn_executable/1, + spawn_driver/1, spawn_executable/1, close_deaf_port/1, unregister_name/1]). -export([]). @@ -113,7 +113,7 @@ all(suite) -> otp_3906, otp_4389, win_massive, mix_up_ports, otp_5112, otp_5119, exit_status_multi_scheduling_block, - ports, spawn_driver, spawn_executable, + ports, spawn_driver, spawn_executable, close_deaf_port, unregister_name ]. @@ -2293,3 +2293,12 @@ load_driver(Dir, Driver) -> io:format("~s\n", [erl_ddll:format_error(Error)]), Res end. + + +close_deaf_port(doc) -> ["Send data to port program that does not read it, then close port."]; +close_deaf_port(suite) -> []; +close_deaf_port(Config) when is_list(Config) -> + Port = open_port({spawn,"sleep 999999"},[]), + erlang:port_command(Port,"Hello, can you hear me!?!?"), + port_close(Port), + ok. |