diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c index 73be5e1a8cb..cbe96f40a8b 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 cf7e4032f4a..97d913bf996 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 f0b4bfb9db7..dcb6776842e 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,10 +82,32 @@ __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) { @@ -157,6 +189,17 @@ __gnat_expect_poll (int *fd, int num_fd, int timeout, int *is_set) #include #include +int +__gnat_waitpid (int pid) +{ + int status = 0; + + waitpid (pid, &status, 0); + status = WEXITSTATUS (status); + + return status; +} + int __gnat_pipe (int *fd) { @@ -297,6 +340,17 @@ __gnat_kill (int pid, int sig) kill (pid, sig); } +int +__gnat_waitpid (int pid) +{ + int status = 0; + + waitpid (pid, &status, 0); + status = WEXITSTATUS (status); + + return status; +} + int __gnat_pipe (int *fd) { @@ -404,6 +458,12 @@ __gnat_kill (int pid, int sig) { } +int +__gnat_waitpid (int pid, int sig) +{ + return 0; +} + int __gnat_pipe (int *fd) {