ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/win_process.c
(Generate patch)

Comparing ray/src/common/win_process.c (file contents):
Revision 3.2 by schorsch, Thu Jul 3 22:41:44 2003 UTC vs.
Revision 3.8 by greg, Fri Nov 8 18:08:07 2013 UTC

# Line 16 | Line 16 | static char RCSid[]="$Id$";
16   #include <io.h>      /* _open_osfhandle */
17   #include <fcntl.h>   /* _O_XXX */
18  
19 < #include "standard.h"
19 > #include "rterror.h"
20 > #include "rtio.h"
21   #include "rtprocess.h"
22  
23  
24 < /* Looks like some Windows versions use negative PIDs.
25 <   Let's just hope they either make them *all* negative, or none.  */
26 < static int system_uses_negative_pids = 0;
24 > int
25 > win_nice(int inc) /* simple nice(2) replacement for Windows */
26 > {
27 >        /* We don't have much granularity available: IDLE_PRIORITY_CLASS
28 >           will run whenever no other higher priority process is running */
29 >        if (inc > 0) {
30 >                return (int)!SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
31 >        }
32 >        return 0;
33 > }
34  
35  
36   /*
# Line 177 | Line 185 | error: /* cleanup */
185          if(hWrite) CloseHandle(hWrite);
186          if(hCurProc) CloseHandle(hCurProc);
187          proc->running = 0;
188 <        return 0;
188 >        return -1;
189          /* There... Are we happy now? */
190   }
191  
# Line 271 | Line 279 | open_process(SUBPROC *proc, char *av[])
279          char *cmdpath;
280          char *cmdstr;
281  
282 +        if (av == NULL || av[0] == NULL) {
283 +                fputs("Illegal call to open_process()!\n", stderr);
284 +                return -1;
285 +        }
286          proc->running = 0;
287 +        if (av == NULL) { return -1; }
288          cmdpath = getpath(av[0], getenv("PATH"), X_OK);
289 <        cmdstr = quoted_cmdline(cmdpath, av);
289 >        cmdstr = quoted_cmdline(cmdpath, av+1);
290          if (cmdstr == NULL) { return 0; }
291          return start_process(proc, cmdstr);
292   }
293  
294  
295 + int win_kill(RT_PID pid, int sig) /* we ignore sig... */
296 + {
297 +        HANDLE hProc;
298 +
299 +        hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE, pid);
300 +        /*  it looks like we want to ignore errors here */
301 +        if(hProc != NULL) {
302 + #ifdef OBSOLETE_WINDOWS
303 + #define KILL_TIMEOUT 10 * 1000 /* milliseconds */
304 +                /* it might have some windows open... */
305 +                EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM)pid);
306 +                if(WaitForSingleObject(hProc, KILL_TIMEOUT)!=WAIT_OBJECT_0) {
307 +                        /* No way to avoid dangling DLLs here. */
308 +                        TerminateProcess(hProc, 0);
309 +                }
310 + #else
311 +                SafeTerminateProcess(hProc, 0);
312 + #endif
313 +                /* WaitForSingleObject(hProc, 0); */
314 +                /* not much use to wait on Windows */
315 +                CloseHandle(hProc);
316 +        }
317 +        return 0; /* XXX we need to figure out more here... */
318 + }
319 +
320 +
321   int
322   close_process(SUBPROC *proc) {
323          int icres, ocres;
324          DWORD pid;
286        HANDLE hProc;
325  
326          ocres = close(proc->w);
327          icres = close(proc->r);
328          pid = proc->pid;
329          if(ocres != 0 || icres != 0) {
292                hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE, pid);
330                  /* something went wrong: enforce infanticide */
331                  /* other than that, it looks like we want to ignore errors here */
332                  if (proc->running) {
333 <                        if(hProc != NULL) {
297 < #ifdef OBSOLETE_WINDOWS
298 < #define KILL_TIMEOUT 10 * 1000 /* milliseconds */
299 <                                /* it might have some windows open... */
300 <                                EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM)pid);
301 <                                if(WaitForSingleObject(hProc, KILL_TIMEOUT)!=WAIT_OBJECT_0) {
302 <                                        /* No way to avoid dangling DLLs here. */
303 <                                        TerminateProcess(hProc, 0);
304 <                                }
305 < #else
306 <                                SafeTerminateProcess(hProc, 0);
307 < #endif
308 <                                /* WaitForSingleObject(hProc, 0); */
309 <                                /* not much use to wait on Windows */
310 <                                CloseHandle(hProc);
311 <                        }
333 >                        win_kill(pid, 0);
334                  }
335          }
336          proc->running = 0;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines