[Ada] Improve detection of end of the process by GNAT.Expect

'read' system call may be interrupted by signal with 'errno' is set to
EINTER. In this case, re-try a few times.

2019-08-21  Vadim Godunko  <godunko@adacore.com>

gcc/ada/

	* libgnat/g-expect.adb (Expect_Internal): Attempt to read
	several times when 'read' returns non-positive.

From-SVN: r274791
This commit is contained in:
Vadim Godunko 2019-08-21 08:31:20 +00:00 committed by Pierre-Marie de Rodat
parent 7c2a44aebb
commit 5eb349352b
2 changed files with 16 additions and 5 deletions

View file

@ -1,3 +1,8 @@
2019-08-21 Vadim Godunko <godunko@adacore.com>
* libgnat/g-expect.adb (Expect_Internal): Attempt to read
several times when 'read' returns non-positive.
2019-08-21 Piotr Trojanek <trojanek@adacore.com>
* einfo.adb (Is_Discriminal): Remove extra parens.

View file

@ -692,15 +692,21 @@ package body GNAT.Expect is
Buffer_Size := 4096;
end if;
N := Read (Descriptors (D).Output_Fd, Buffer'Address,
Buffer_Size);
-- Read may be interrupted on Linux by a signal and
-- need to be repeated. We don't want to check for
-- errno = EINTER, so just attempt to read a few
-- times.
for J in 1 .. 3 loop
N := Read (Descriptors (D).Output_Fd,
Buffer'Address, Buffer_Size);
exit when N > 0;
end loop;
-- Error or End of file
if N <= 0 then
-- ??? Note that ddd tries again up to three times
-- in that case. See LiterateA.C:174
Close (Descriptors (D).Input_Fd);
Descriptors (D).Input_Fd := Invalid_FD;
Result := Expect_Process_Died;