Commit 19716ceb by Vadim Godunko Committed by Pierre-Marie de Rodat

[Ada] GNAT.Expect (Expect_Internal): Try to call 'poll' few times

'poll' returns -1 in case of any error (including interruption by a
signal), so call need to be repeated few times to avoid false failures.

2019-09-17  Vadim Godunko  <godunko@adacore.com>

gcc/ada/

	* libgnat/g-expect.adb (Expect_Internal): Try to call 'poll' few
	times.

From-SVN: r275782
parent b9bfbf45
2019-09-17 Vadim Godunko <godunko@adacore.com> 2019-09-17 Vadim Godunko <godunko@adacore.com>
* libgnat/g-expect.adb (Expect_Internal): Try to call 'poll' few
times.
2019-09-17 Vadim Godunko <godunko@adacore.com>
* libgnat/g-expect.ads, libgnat/g-expect.adb (Close_Input): New * libgnat/g-expect.ads, libgnat/g-expect.adb (Close_Input): New
subprogram. subprogram.
(Get_Command_Output): Call Close_Input to close input stream. (Get_Command_Output): Call Close_Input to close input stream.
......
...@@ -679,8 +679,17 @@ package body GNAT.Expect is ...@@ -679,8 +679,17 @@ package body GNAT.Expect is
-- Loop until we match or we have a timeout -- Loop until we match or we have a timeout
loop loop
Num_Descriptors := -- Poll may be interrupted on Linux by a signal and need to be
Poll (Fds'Address, Fds_Count, Timeout, D'Access, Is_Set'Address); -- repeated. We don't want to check for errno = EINTER, so just
-- attempt to call Poll a few times.
for J in 1 .. 3 loop
Num_Descriptors :=
Poll
(Fds'Address, Fds_Count, Timeout, D'Access, Is_Set'Address);
exit when Num_Descriptors /= -1;
end loop;
case Num_Descriptors is case Num_Descriptors is
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment