diff --git a/7.1.279 b/7.1.279 new file mode 100644 index 0000000..b44beae --- /dev/null +++ b/7.1.279 @@ -0,0 +1,146 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.279 +Fcc: outbox +From: Bram Moolenaar +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 + + +*** ../vim-7.1.278/src/if_cscope.c Fri Sep 14 19:56:18 2007 +--- src/if_cscope.c Sat Mar 15 12:38:12 2008 +*************** +*** 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 ---- +*** ../vim-7.1.278/src/version.c Wed Mar 12 21:47:31 2008 +--- src/version.c Sat Mar 15 12:38:58 2008 +*************** +*** 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 ///