aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDmitriy Anisimkov <anisimko@adacore.com>2021-12-15 19:26:50 +0600
committerPierre-Marie de Rodat <derodat@adacore.com>2022-01-07 16:24:10 +0000
commit9e6274e0a3b60e77a42784c3fb6ef2aa3cfc071a (patch)
tree7366e040405074b954c1650a1e9b0f3f7a6fb15b /gcc
parent69a6631a6ff0074083da528e3eec7dbf4997a609 (diff)
downloadgcc-9e6274e0a3b60e77a42784c3fb6ef2aa3cfc071a.zip
gcc-9e6274e0a3b60e77a42784c3fb6ef2aa3cfc071a.tar.gz
gcc-9e6274e0a3b60e77a42784c3fb6ef2aa3cfc071a.tar.bz2
[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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/adaint.c14
-rw-r--r--gcc/ada/expect.c13
2 files changed, 13 insertions, 14 deletions
diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c
index 6781728..2db3528 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 a92c465..86cbcba0 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;
}