public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-6357] [Ada] Fix exit status of GNAT.Expect.Close call on running process
@ 2022-01-07 16:27 Pierre-Marie de Rodat
  0 siblings, 0 replies; only message in thread
From: Pierre-Marie de Rodat @ 2022-01-07 16:27 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:9e6274e0a3b60e77a42784c3fb6ef2aa3cfc071a

commit r12-6357-g9e6274e0a3b60e77a42784c3fb6ef2aa3cfc071a
Author: Dmitriy Anisimkov <anisimko@adacore.com>
Date:   Wed Dec 15 19:26:50 2021 +0600

    [Ada] Fix exit status of GNAT.Expect.Close call on running process
    
    gcc/ada/
    
            * expect.c (__gnat_waitpid): Use macros WIFEXITED, WEXITSTATUS,
            WIFSIGNALED, WTERMSIG, WIFSTOPPED, WSTOPSIG to get exit status
            or signal that caused the child process to terminate/stop.  Do
            not process exit status in case of error in waitpid call.
            * adaint.c (__gnat_kill): Use of GenerateConsoleCtrlEvent is
            removed in Windows variant as it actually is not working and was
            terminating the calling process.  Set signal number into exit
            code parameter of TerminateProcess to work the same like in
            Linux.

Diff:
---
 gcc/ada/adaint.c | 14 ++------------
 gcc/ada/expect.c | 13 +++++++++++--
 2 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c
index 6781728f45e..2db35283eac 100644
--- a/gcc/ada/adaint.c
+++ b/gcc/ada/adaint.c
@@ -3562,18 +3562,8 @@ __gnat_kill (int pid, int sig, int close ATTRIBUTE_UNUSED)
   HANDLE h = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid);
   if (h == NULL)
     return;
-  if (sig == 9)
-    {
-      TerminateProcess (h, 1);
-    }
-  else if (sig == SIGINT)
-    GenerateConsoleCtrlEvent (CTRL_C_EVENT, pid);
-  else if (sig == SIGBREAK)
-    GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, pid);
-  /* ??? The last two alternatives don't really work. SIGBREAK requires setting
-     up process groups at start time which we don't do; treating SIGINT is just
-     not possible apparently. So we really only support signal 9. Fortunately
-     that's all we use in GNAT.Expect */
+
+  TerminateProcess (h, sig);
 
   CloseHandle (h);
 #elif defined (__vxworks)
diff --git a/gcc/ada/expect.c b/gcc/ada/expect.c
index a92c465a473..86cbcba0e64 100644
--- a/gcc/ada/expect.c
+++ b/gcc/ada/expect.c
@@ -345,8 +345,17 @@ __gnat_waitpid (int pid)
 {
   int status = 0;
 
-  waitpid (pid, &status, 0);
-  status = WEXITSTATUS (status);
+  if (waitpid (pid, &status, 0) == -1) {
+     return -1;
+  }
+
+  if WIFEXITED (status) {
+     status = WEXITSTATUS (status);
+  } else if WIFSIGNALED (status) {
+     status = WTERMSIG (status);
+  } else if WIFSTOPPED (status) {
+     status = WSTOPSIG (status);
+  }
 
   return status;
 }


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-01-07 16:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-07 16:27 [gcc r12-6357] [Ada] Fix exit status of GNAT.Expect.Close call on running process Pierre-Marie de Rodat

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).