| To: vim-dev@vim.org |
| Subject: Patch 7.1.279 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=ISO-8859-1 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.1.279 |
| Problem: When using cscope temporary files are left behind. |
| Solution: Send the quit command to cscope and give it two seconds to exit |
| nicely before killing it. (partly by Dominique Pelle) |
| Files: src/if_cscope.c |
| |
| |
| |
| |
| |
| *** 2096,2101 **** |
| --- 2096,2113 ---- |
| return CSCOPE_SUCCESS; |
| } |
| |
| + #if defined(UNIX) && defined(SIGALRM) |
| + /* |
| + * Used to catch and ignore SIGALRM below. |
| + */ |
| + /* ARGSUSED */ |
| + static RETSIGTYPE |
| + sig_handler SIGDEFARG(sigarg) |
| + { |
| + /* do nothing */ |
| + SIGRETURN; |
| + } |
| + #endif |
| |
| /* |
| * PRIVATE: cs_release_csp |
| |
| *** 2108,2116 **** |
| int i; |
| int freefnpp; |
| { |
| - #if defined(UNIX) |
| - int pstat; |
| - #else |
| /* |
| * Trying to exit normally (not sure whether it is fit to UNIX cscope |
| */ |
| --- 2120,2125 ---- |
| |
| *** 2119,2124 **** |
| --- 2128,2179 ---- |
| (void)fputs("q\n", csinfo[i].to_fp); |
| (void)fflush(csinfo[i].to_fp); |
| } |
| + #if defined(UNIX) |
| + { |
| + int pstat; |
| + pid_t pid; |
| + |
| + # if defined(HAVE_SIGACTION) |
| + struct sigaction sa, old; |
| + |
| + /* Use sigaction() to limit the waiting time to two seconds. */ |
| + sa.sa_handler = sig_handler; |
| + sa.sa_flags = SA_NODEFER; |
| + sigaction(SIGALRM, &sa, &old); |
| + alarm(2); /* 2 sec timeout */ |
| + |
| + /* Block until cscope exits or until timer expires */ |
| + pid = waitpid(csinfo[i].pid, &pstat, 0); |
| + |
| + /* cancel pending alarm if still there and restore signal */ |
| + alarm(0); |
| + sigaction(SIGALRM, &old, NULL); |
| + # else |
| + int waited; |
| + |
| + /* Can't use sigaction(), loop for two seconds. First yield the CPU |
| + * to give cscope a chance to exit quickly. */ |
| + sleep(0); |
| + for (waited = 0; waited < 40; ++waited) |
| + { |
| + pid = waitpid(csinfo[i].pid, &pstat, WNOHANG); |
| + if (pid != 0) |
| + break; /* break unless the process is still running */ |
| + mch_delay(50, FALSE); /* sleep 50 ms */ |
| + } |
| + # endif |
| + /* |
| + * If the cscope process is still running: kill it. |
| + * Safety check: If the PID would be zero here, the entire X session |
| + * would be killed. -1 and 1 are dangerous as well. |
| + */ |
| + if (pid < 0 && csinfo[i].pid > 1) |
| + { |
| + kill(csinfo[i].pid, SIGTERM); |
| + (void)waitpid(csinfo[i].pid, &pstat, 0); |
| + } |
| + } |
| + #else /* !UNIX */ |
| if (csinfo[i].hProc != NULL) |
| { |
| /* Give cscope a chance to exit normally */ |
| |
| *** 2133,2150 **** |
| if (csinfo[i].to_fp != NULL) |
| (void)fclose(csinfo[i].to_fp); |
| |
| - /* |
| - * Safety check: If the PID would be zero here, the entire X session would |
| - * be killed. -1 and 1 are dangerous as well. |
| - */ |
| - #if defined(UNIX) |
| - if (csinfo[i].pid > 1) |
| - { |
| - kill(csinfo[i].pid, SIGTERM); |
| - (void)waitpid(csinfo[i].pid, &pstat, 0); |
| - } |
| - #endif |
| - |
| if (freefnpp) |
| { |
| vim_free(csinfo[i].fname); |
| --- 2188,2193 ---- |
| |
| |
| |
| *** 668,669 **** |
| --- 668,671 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 279, |
| /**/ |
| |
| -- |
| hundred-and-one symptoms of being an internet addict: |
| 130. You can't get out of your desk even if it's time to eat or time |
| to go to the bathroom. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ download, build and distribute -- http://www.A-A-P.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |