From e602394c38b7ad5053769e2ff03550fd5b5d412a Mon Sep 17 00:00:00 2001 From: Pascal Obry Date: Fri, 18 Mar 2005 12:46:57 +0100 Subject: [PATCH] adaint.h, adaint.c (__gnat_waitpid): Moved to expect.c where it is used. 2005-03-17 Pascal Obry * adaint.h, adaint.c (__gnat_waitpid): Moved to expect.c where it is used. * expect.c (__gnat_waitpid): Moved here from adaint.c. Reimplement under Win32 using Win32 API. (__gnat_kill) [Win32]: Properly close the process handle before leaving this routine. From-SVN: r96659 --- gcc/ada/adaint.c | 17 ---------------- gcc/ada/adaint.h | 1 - gcc/ada/expect.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 61 insertions(+), 19 deletions(-) diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c index 73be5e1..cbe96f4 100644 --- a/gcc/ada/adaint.c +++ b/gcc/ada/adaint.c @@ -1927,23 +1927,6 @@ __gnat_portable_wait (int *process_status) return pid; } -int -__gnat_waitpid (int pid) -{ - int status = 0; - -#if defined (_WIN32) - cwait (&status, pid, _WAIT_CHILD); -#elif defined (__EMX__) || defined (MSDOS) || defined (__vxworks) - /* Status is already zero, so nothing to do. */ -#else - waitpid (pid, &status, 0); - status = WEXITSTATUS (status); -#endif - - return status; -} - void __gnat_os_exit (int status) { diff --git a/gcc/ada/adaint.h b/gcc/ada/adaint.h index cf7e403..97d913b 100644 --- a/gcc/ada/adaint.h +++ b/gcc/ada/adaint.h @@ -93,7 +93,6 @@ extern int __gnat_is_symbolic_link (char *name); extern int __gnat_portable_spawn (char *[]); extern int __gnat_portable_no_block_spawn (char *[]); extern int __gnat_portable_wait (int *); -extern int __gnat_waitpid (int); extern char *__gnat_locate_exec (char *, char *); extern char *__gnat_locate_exec_on_path (char *); extern char *__gnat_locate_regular_file (char *, char *); diff --git a/gcc/ada/expect.c b/gcc/ada/expect.c index f0b4bfb..dcb6776 100644 --- a/gcc/ada/expect.c +++ b/gcc/ada/expect.c @@ -43,6 +43,16 @@ #include "system.h" #endif +#include + +#ifdef __MINGW32__ +#if OLD_MINGW +#include +#endif +#else +#include +#endif + /* This file provides the low level functionalities needed to implement Expect capabilities in GNAT.Expect. Implementations for unix and windows systems is provided. @@ -72,11 +82,33 @@ __gnat_kill (int pid, int sig) { process_handle = OpenProcess (PROCESS_TERMINATE, FALSE, pid); if (process_handle != NULL) - TerminateProcess (process_handle, 0); + { + TerminateProcess (process_handle, 0); + CloseHandle (process_handle); + } } } int +__gnat_waitpid (int pid) +{ + HANDLE process_handle; + DWORD exitcode = 1; + DWORD res; + + process_handle = OpenProcess (PROCESS_QUERY_INFORMATION, FALSE, pid); + + if (process_handle != NULL) + { + res = WaitForSingleObject (process_handle, INFINITE); + GetExitCodeProcess (process_handle, &exitcode); + CloseHandle (process_handle); + } + + return (int) exitcode; +} + +int __gnat_expect_fork (void) { return 0; @@ -158,6 +190,17 @@ __gnat_expect_poll (int *fd, int num_fd, int timeout, int *is_set) #include int +__gnat_waitpid (int pid) +{ + int status = 0; + + waitpid (pid, &status, 0); + status = WEXITSTATUS (status); + + return status; +} + +int __gnat_pipe (int *fd) { return pipe (fd); @@ -298,6 +341,17 @@ __gnat_kill (int pid, int sig) } int +__gnat_waitpid (int pid) +{ + int status = 0; + + waitpid (pid, &status, 0); + status = WEXITSTATUS (status); + + return status; +} + +int __gnat_pipe (int *fd) { return pipe (fd); @@ -405,6 +459,12 @@ __gnat_kill (int pid, int sig) } int +__gnat_waitpid (int pid, int sig) +{ + return 0; +} + +int __gnat_pipe (int *fd) { return -1; -- 2.7.4