This is the mail archive of the
mailing list for the GCC project.
[Ada] Improve detection of end of the process by GNAT.Expect
- From: Pierre-Marie de Rodat <derodat at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Vadim Godunko <godunko at adacore dot com>
- Date: Wed, 21 Aug 2019 04:31:43 -0400
- Subject: [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.
Tested on x86_64-pc-linux-gnu, committed on trunk
2019-08-21 Vadim Godunko <firstname.lastname@example.org>
* libgnat/g-expect.adb (Expect_Internal): Attempt to read
several times when 'read' returns non-positive.
@@ -692,15 +692,21 @@ package body GNAT.Expect is
Buffer_Size := 4096;
- N := Read (Descriptors (D).Output_Fd, Buffer'Address,
+ -- 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;