[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:
parent
7c2a44aebb
commit
5eb349352b
2 changed files with 16 additions and 5 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue