--- ray/src/common/win_process.c 2003/07/03 22:41:44 3.2 +++ ray/src/common/win_process.c 2004/10/23 18:55:52 3.5 @@ -1,5 +1,5 @@ #ifndef lint -static char RCSid[]="$Id: win_process.c,v 3.2 2003/07/03 22:41:44 schorsch Exp $"; +static char RCSid[]="$Id: win_process.c,v 3.5 2004/10/23 18:55:52 schorsch Exp $"; #endif /* * Routines to communicate with separate process via dual pipes. @@ -16,13 +16,21 @@ static char RCSid[]="$Id: win_process.c,v 3.2 2003/07/ #include /* _open_osfhandle */ #include /* _O_XXX */ -#include "standard.h" +#include "rterror.h" +#include "rtio.h" #include "rtprocess.h" -/* Looks like some Windows versions use negative PIDs. - Let's just hope they either make them *all* negative, or none. */ -static int system_uses_negative_pids = 0; +int +win_nice(int inc) /* simple nice(2) replacement for Windows */ +{ + /* We don't have much granularity available: IDLE_PRIORITY_CLASS + will run whenever no other higher priority process is running */ + if (inc > 0) { + return (int)!SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS); + } + return 0; +} /* @@ -279,36 +287,45 @@ open_process(SUBPROC *proc, char *av[]) } +int win_kill(RT_PID pid, int sig) /* we ignore sig... */ +{ + HANDLE hProc; + + hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE, pid); + /* it looks like we want to ignore errors here */ + if(hProc != NULL) { +#ifdef OBSOLETE_WINDOWS +#define KILL_TIMEOUT 10 * 1000 /* milliseconds */ + /* it might have some windows open... */ + EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM)pid); + if(WaitForSingleObject(hProc, KILL_TIMEOUT)!=WAIT_OBJECT_0) { + /* No way to avoid dangling DLLs here. */ + TerminateProcess(hProc, 0); + } +#else + SafeTerminateProcess(hProc, 0); +#endif + /* WaitForSingleObject(hProc, 0); */ + /* not much use to wait on Windows */ + CloseHandle(hProc); + } + return 0; /* XXX we need to figure out more here... */ +} + + int close_process(SUBPROC *proc) { int icres, ocres; DWORD pid; - HANDLE hProc; ocres = close(proc->w); icres = close(proc->r); pid = proc->pid; if(ocres != 0 || icres != 0) { - hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE, pid); /* something went wrong: enforce infanticide */ /* other than that, it looks like we want to ignore errors here */ if (proc->running) { - if(hProc != NULL) { -#ifdef OBSOLETE_WINDOWS -#define KILL_TIMEOUT 10 * 1000 /* milliseconds */ - /* it might have some windows open... */ - EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM)pid); - if(WaitForSingleObject(hProc, KILL_TIMEOUT)!=WAIT_OBJECT_0) { - /* No way to avoid dangling DLLs here. */ - TerminateProcess(hProc, 0); - } -#else - SafeTerminateProcess(hProc, 0); -#endif - /* WaitForSingleObject(hProc, 0); */ - /* not much use to wait on Windows */ - CloseHandle(hProc); - } + int win_kill(pid, 0); } } proc->running = 0;