X-Git-Url: http://git.chise.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fcallproc.c;h=8694b3867b660f14315b228cecadd896efb4677b;hb=ea21eb75bbf90355514d65686bd53bea579f8e23;hp=2b45793b378063575a0486f9fdb17eff2db7eec3;hpb=b73e352f264e9da0a00159dc29f318305cbe8636;p=chise%2Fxemacs-chise.git diff --git a/src/callproc.c b/src/callproc.c index 2b45793..8694b38 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -104,6 +104,9 @@ call_process_cleanup (Lisp_Object fdpid) { int fd = XINT (Fcar (fdpid)); int pid = XINT (Fcdr (fdpid)); +#ifdef WINDOWSNT + HANDLE pHandle; +#endif if (!call_process_exited && EMACS_KILLPG (pid, SIGINT) == 0) @@ -114,7 +117,17 @@ call_process_cleanup (Lisp_Object fdpid) /* #### "c-G" -- need non-consing Single-key-description */ message ("Waiting for process to die...(type C-g again to kill it instantly)"); +#ifdef WINDOWSNT + pHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid); + if (pHandle == NULL) + { + warn_when_safe (Qprocess, Qwarning, + "cannot open process (PID %d) for cleanup", pid); + } + wait_for_termination (pHandle); +#else wait_for_termination (pid); +#endif /* "Discard" the unwind protect. */ XCAR (fdpid) = Qnil; @@ -170,6 +183,9 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you Lisp_Object infile, buffer, current_dir, display, path; int fd[2]; int filefd; +#ifdef WINDOWSNT + HANDLE pHandle; +#endif int pid; char buf[16384]; char *bufptr = buf; @@ -359,6 +375,23 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you #ifdef WINDOWSNT pid = child_setup (filefd, fd1, fd_error, new_argv, (char *) XSTRING_DATA (current_dir)); + if (!INTP (buffer)) + { + /* OpenProcess() as soon after child_setup as possible. It's too + late once the process terminated. */ + pHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid); +#if 0 + if (pHandle == NULL) + { + /* #### seems to cause crash in unbind_to(...) below. APA */ + warn_when_safe (Qprocess, Qwarning, + "cannot open process to wait for"); + } +#endif + } + /* Close STDERR into the parent process. We no longer need it. */ + if (fd_error >= 0) + close (fd_error); #else /* not WINDOWSNT */ pid = fork (); @@ -394,12 +427,14 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you if (!NILP (fork_error)) signal_error (Qfile_error, fork_error); +#ifndef WINDOWSNT if (pid < 0) { if (fd[0] >= 0) close (fd[0]); report_file_error ("Doing fork", Qnil); } +#endif if (INTP (buffer)) { @@ -507,7 +542,11 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you QUIT; /* Wait for it to terminate, unless it already has. */ +#ifdef WINDOWSNT + wait_for_termination (pHandle); +#else wait_for_termination (pid); +#endif /* Don't kill any children that the subprocess may have left behind when exiting. */