diff options
author | Vadim Godunko <godunko@adacore.com> | 2019-09-17 08:01:48 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-09-17 08:01:48 +0000 |
commit | 94c44a8a3000348707a456f8ebc1b1d67b688ea4 (patch) | |
tree | 6ea3745bc0beb963fc8ed9f6826320b35b2629cc | |
parent | 19716ceb1676e1a947527b3ae1d59dce646dd76c (diff) | |
download | gcc-94c44a8a3000348707a456f8ebc1b1d67b688ea4.zip gcc-94c44a8a3000348707a456f8ebc1b1d67b688ea4.tar.gz gcc-94c44a8a3000348707a456f8ebc1b1d67b688ea4.tar.bz2 |
[Ada] Close file descriptors allocated for tty only once
2019-09-17 Vadim Godunko <godunko@adacore.com>
gcc/ada/
* libgnat/g-exptty.ads (Close_Input): New subprogram.
* libgnat/g-exptty.adb (Close_Input): New subprogram.
(Close): Move close of TTY to Close_Input.
* terminals.c (__gnat_close_tty): Set file descriptors to
invalid value after close.
From-SVN: r275783
-rw-r--r-- | gcc/ada/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/ada/libgnat/g-exptty.adb | 48 | ||||
-rw-r--r-- | gcc/ada/libgnat/g-exptty.ads | 2 | ||||
-rw-r--r-- | gcc/ada/terminals.c | 4 |
4 files changed, 53 insertions, 9 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index ab8c8a5..1ef2c62 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,13 @@ 2019-09-17 Vadim Godunko <godunko@adacore.com> + * libgnat/g-exptty.ads (Close_Input): New subprogram. + * libgnat/g-exptty.adb (Close_Input): New subprogram. + (Close): Move close of TTY to Close_Input. + * terminals.c (__gnat_close_tty): Set file descriptors to + invalid value after close. + +2019-09-17 Vadim Godunko <godunko@adacore.com> + * libgnat/g-expect.adb (Expect_Internal): Try to call 'poll' few times. diff --git a/gcc/ada/libgnat/g-exptty.adb b/gcc/ada/libgnat/g-exptty.adb index 4f0300f..b193448 100644 --- a/gcc/ada/libgnat/g-exptty.adb +++ b/gcc/ada/libgnat/g-exptty.adb @@ -74,9 +74,6 @@ package body GNAT.Expect.TTY is procedure Free_Process (Process : System.Address); pragma Import (C, Free_Process, "__gnat_free_process"); - procedure Close_TTY (Process : System.Address); - pragma Import (C, Close_TTY, "__gnat_close_tty"); - begin -- If we haven't already closed the process @@ -123,10 +120,6 @@ package body GNAT.Expect.TTY is Status := Descriptor.Exit_Status; end if; - if not On_Windows then - Close_TTY (Descriptor.Process); - end if; - Free_Process (Descriptor.Process'Address); Descriptor.Process := System.Null_Address; @@ -141,6 +134,47 @@ package body GNAT.Expect.TTY is Close (Descriptor, Status); end Close; + ----------------- + -- Close_Input -- + ----------------- + + overriding procedure Close_Input + (Descriptor : in out TTY_Process_Descriptor) + is + function TTY_FD + (Handle : System.Address) return GNAT.OS_Lib.File_Descriptor; + pragma Import (C, TTY_FD, "__gnat_tty_fd"); + + procedure Close_TTY (Process : System.Address); + pragma Import (C, Close_TTY, "__gnat_close_tty"); + + begin + if not On_Windows and then Descriptor.Process /= System.Null_Address then + -- Check whether input/output/error streams use master descriptor and + -- reset corresponding members. + + if Descriptor.Input_Fd = TTY_FD (Descriptor.Process) then + Descriptor.Input_Fd := Invalid_FD; + end if; + + if Descriptor.Output_Fd = TTY_FD (Descriptor.Process) then + Descriptor.Output_Fd := Invalid_FD; + end if; + + if Descriptor.Error_Fd = TTY_FD (Descriptor.Process) then + Descriptor.Error_Fd := Invalid_FD; + end if; + + -- Close master descriptor. + + Close_TTY (Descriptor.Process); + end if; + + -- Call parent's implementation to close all remaining descriptors. + + Process_Descriptor (Descriptor).Close_Input; + end Close_Input; + ----------------------------- -- Close_Pseudo_Descriptor -- ----------------------------- diff --git a/gcc/ada/libgnat/g-exptty.ads b/gcc/ada/libgnat/g-exptty.ads index 57aa8d7..81068a6 100644 --- a/gcc/ada/libgnat/g-exptty.ads +++ b/gcc/ada/libgnat/g-exptty.ads @@ -134,6 +134,8 @@ private Cmd : String; Args : System.Address); + procedure Close_Input (Descriptor : in out TTY_Process_Descriptor); + Still_Active : constant Integer := -1; type TTY_Process_Descriptor is new Process_Descriptor with record diff --git a/gcc/ada/terminals.c b/gcc/ada/terminals.c index 320ad28..0ce3fb7 100644 --- a/gcc/ada/terminals.c +++ b/gcc/ada/terminals.c @@ -1648,8 +1648,8 @@ __gnat_new_tty (void) */ void __gnat_close_tty (pty_desc* desc) { - if (desc->master_fd >= 0) close (desc->master_fd); - if (desc->slave_fd >= 0) close (desc->slave_fd); + if (desc->master_fd >= 0) { close (desc->master_fd); desc->master_fd = -1; } + if (desc->slave_fd >= 0) { close (desc->slave_fd); desc->slave_fd = -1; } } /* __gnat_tty_name - return slave side device name |