| To: vim-dev@vim.org |
| Subject: Patch 7.2.130 |
| 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.2.130 |
| Problem: Vim may haing until CTRL-C is typed when using CTRL-Z. |
| Solution: Avoid using pause(). Also use "volatile" for variables used in |
| signal functions. (Dominique Pelle) |
| Files: src/auto/configure, src/configure.in, src/config.h.in, |
| src/globals.h, src/os_unix.c |
| |
| |
| |
| |
| |
| *** 11565,11570 **** |
| --- 11565,11631 ---- |
| |
| fi |
| |
| + { $as_echo "$as_me:$LINENO: checking for working volatile" >&5 |
| + $as_echo_n "checking for working volatile... " >&6; } |
| + if test "${ac_cv_c_volatile+set}" = set; then |
| + $as_echo_n "(cached) " >&6 |
| + else |
| + cat >conftest.$ac_ext <<_ACEOF |
| + /* confdefs.h. */ |
| + _ACEOF |
| + cat confdefs.h >>conftest.$ac_ext |
| + cat >>conftest.$ac_ext <<_ACEOF |
| + /* end confdefs.h. */ |
| + |
| + int |
| + main () |
| + { |
| + |
| + volatile int x; |
| + int * volatile y = (int *) 0; |
| + return !x && !y; |
| + ; |
| + return 0; |
| + } |
| + _ACEOF |
| + rm -f conftest.$ac_objext |
| + if { (ac_try="$ac_compile" |
| + case "(($ac_try" in |
| + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; |
| + *) ac_try_echo=$ac_try;; |
| + esac |
| + eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" |
| + $as_echo "$ac_try_echo") >&5 |
| + (eval "$ac_compile") 2>conftest.er1 |
| + ac_status=$? |
| + grep -v '^ *+' conftest.er1 >conftest.err |
| + rm -f conftest.er1 |
| + cat conftest.err >&5 |
| + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 |
| + (exit $ac_status); } && { |
| + test -z "$ac_c_werror_flag" || |
| + test ! -s conftest.err |
| + } && test -s conftest.$ac_objext; then |
| + ac_cv_c_volatile=yes |
| + else |
| + $as_echo "$as_me: failed program was:" >&5 |
| + sed 's/^/| /' conftest.$ac_ext >&5 |
| + |
| + ac_cv_c_volatile=no |
| + fi |
| + |
| + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext |
| + fi |
| + { $as_echo "$as_me:$LINENO: result: $ac_cv_c_volatile" >&5 |
| + $as_echo "$ac_cv_c_volatile" >&6; } |
| + if test $ac_cv_c_volatile = no; then |
| + |
| + cat >>confdefs.h <<\_ACEOF |
| + #define volatile /**/ |
| + _ACEOF |
| + |
| + fi |
| + |
| { $as_echo "$as_me:$LINENO: checking for mode_t" >&5 |
| $as_echo_n "checking for mode_t... " >&6; } |
| if test "${ac_cv_type_mode_t+set}" = set; then |
| |
| |
| |
| *** 2148,2153 **** |
| --- 2148,2154 ---- |
| dnl Checks for typedefs, structures, and compiler characteristics. |
| AC_PROG_GCC_TRADITIONAL |
| AC_C_CONST |
| + AC_C_VOLATILE |
| AC_TYPE_MODE_T |
| AC_TYPE_OFF_T |
| AC_TYPE_PID_T |
| |
| |
| |
| *** 50,55 **** |
| --- 50,58 ---- |
| /* Define to empty if the keyword does not work. */ |
| #undef const |
| |
| + /* Define to empty if the keyword does not work. */ |
| + #undef volatile |
| + |
| /* Define to `int' if <sys/types.h> doesn't define. */ |
| #undef mode_t |
| |
| |
| |
| |
| *** 482,489 **** |
| /* |
| * While executing external commands or in Ex mode, should not insert GUI |
| * events in the input buffer: Set hold_gui_events to non-zero. |
| */ |
| ! EXTERN int hold_gui_events INIT(= 0); |
| |
| /* |
| * When resizing the shell is postponed, remember the new size, and call |
| --- 482,491 ---- |
| /* |
| * While executing external commands or in Ex mode, should not insert GUI |
| * events in the input buffer: Set hold_gui_events to non-zero. |
| + * |
| + * volatile because it is used in signal handler sig_sysmouse(). |
| */ |
| ! EXTERN volatile int hold_gui_events INIT(= 0); |
| |
| /* |
| * When resizing the shell is postponed, remember the new size, and call |
| |
| *** 597,603 **** |
| EXTERN int really_exiting INIT(= FALSE); |
| /* TRUE when we are sure to exit, e.g., after |
| * a deadly signal */ |
| ! EXTERN int full_screen INIT(= FALSE); |
| /* TRUE when doing full-screen output |
| * otherwise only writing some messages */ |
| |
| --- 599,606 ---- |
| EXTERN int really_exiting INIT(= FALSE); |
| /* TRUE when we are sure to exit, e.g., after |
| * a deadly signal */ |
| ! /* volatile because it is used in signal handler deathtrap(). */ |
| ! EXTERN volatile int full_screen INIT(= FALSE); |
| /* TRUE when doing full-screen output |
| * otherwise only writing some messages */ |
| |
| |
| *** 739,748 **** |
| */ |
| EXTERN JMP_BUF lc_jump_env; /* argument to SETJMP() */ |
| # ifdef SIGHASARG |
| ! EXTERN int lc_signal; /* catched signal number, 0 when no was signal |
| ! catched; used for mch_libcall() */ |
| # endif |
| ! EXTERN int lc_active INIT(= FALSE); /* TRUE when lc_jump_env is valid. */ |
| #endif |
| |
| #if defined(FEAT_MBYTE) || defined(FEAT_POSTSCRIPT) |
| --- 747,758 ---- |
| */ |
| EXTERN JMP_BUF lc_jump_env; /* argument to SETJMP() */ |
| # ifdef SIGHASARG |
| ! /* volatile because it is used in signal handlers. */ |
| ! EXTERN volatile int lc_signal; /* caught signal number, 0 when no was signal |
| ! caught; used for mch_libcall() */ |
| # endif |
| ! /* volatile because it is used in signal handler deathtrap(). */ |
| ! EXTERN volatile int lc_active INIT(= FALSE); /* TRUE when lc_jump_env is valid. */ |
| #endif |
| |
| #if defined(FEAT_MBYTE) || defined(FEAT_POSTSCRIPT) |
| |
| *** 986,992 **** |
| EXTERN FILE *scriptout INIT(= NULL); /* stream to write script to */ |
| EXTERN int read_cmd_fd INIT(= 0); /* fd to read commands from */ |
| |
| ! EXTERN int got_int INIT(= FALSE); /* set to TRUE when interrupt |
| signal occurred */ |
| #ifdef USE_TERM_CONSOLE |
| EXTERN int term_console INIT(= FALSE); /* set to TRUE when console used */ |
| --- 996,1003 ---- |
| EXTERN FILE *scriptout INIT(= NULL); /* stream to write script to */ |
| EXTERN int read_cmd_fd INIT(= 0); /* fd to read commands from */ |
| |
| ! /* volatile because it is used in signal handler catch_sigint(). */ |
| ! EXTERN volatile int got_int INIT(= FALSE); /* set to TRUE when interrupt |
| signal occurred */ |
| #ifdef USE_TERM_CONSOLE |
| EXTERN int term_console INIT(= FALSE); /* set to TRUE when console used */ |
| |
| |
| |
| *** 181,187 **** |
| && defined(FEAT_TITLE) && !defined(FEAT_GUI_GTK) |
| # define SET_SIG_ALARM |
| static RETSIGTYPE sig_alarm __ARGS(SIGPROTOARG); |
| ! static int sig_alarm_called; |
| #endif |
| static RETSIGTYPE deathtrap __ARGS(SIGPROTOARG); |
| |
| --- 181,188 ---- |
| && defined(FEAT_TITLE) && !defined(FEAT_GUI_GTK) |
| # define SET_SIG_ALARM |
| static RETSIGTYPE sig_alarm __ARGS(SIGPROTOARG); |
| ! /* volatile because it is used in signal handler sig_alarm(). */ |
| ! static volatile int sig_alarm_called; |
| #endif |
| static RETSIGTYPE deathtrap __ARGS(SIGPROTOARG); |
| |
| |
| *** 201,213 **** |
| # define SIG_ERR ((RETSIGTYPE (*)())-1) |
| #endif |
| |
| ! static int do_resize = FALSE; |
| #ifndef __EMX__ |
| static char_u *extra_shell_arg = NULL; |
| static int show_shell_mess = TRUE; |
| #endif |
| ! static int deadly_signal = 0; /* The signal we caught */ |
| ! static int in_mch_delay = FALSE; /* sleeping in mch_delay() */ |
| |
| static int curr_tmode = TMODE_COOK; /* contains current terminal mode */ |
| |
| --- 202,217 ---- |
| # define SIG_ERR ((RETSIGTYPE (*)())-1) |
| #endif |
| |
| ! /* volatile because it is used in signal handler sig_winch(). */ |
| ! static volatile int do_resize = FALSE; |
| #ifndef __EMX__ |
| static char_u *extra_shell_arg = NULL; |
| static int show_shell_mess = TRUE; |
| #endif |
| ! /* volatile because it is used in signal handler deathtrap(). */ |
| ! static volatile int deadly_signal = 0; /* The signal we caught */ |
| ! /* volatile because it is used in signal handler deathtrap(). */ |
| ! static volatile int in_mch_delay = FALSE; /* sleeping in mch_delay() */ |
| |
| static int curr_tmode = TMODE_COOK; /* contains current terminal mode */ |
| |
| |
| *** 802,808 **** |
| #endif |
| |
| /* |
| ! * We need correct potatotypes for a signal function, otherwise mean compilers |
| * will barf when the second argument to signal() is ``wrong''. |
| * Let me try it with a few tricky defines from my own osdef.h (jw). |
| */ |
| --- 806,812 ---- |
| #endif |
| |
| /* |
| ! * We need correct prototypes for a signal function, otherwise mean compilers |
| * will barf when the second argument to signal() is ``wrong''. |
| * Let me try it with a few tricky defines from my own osdef.h (jw). |
| */ |
| |
| *** 1068,1080 **** |
| SIGRETURN; |
| } |
| |
| ! #ifdef _REENTRANT |
| /* |
| * On Solaris with multi-threading, suspending might not work immediately. |
| * Catch the SIGCONT signal, which will be used as an indication whether the |
| * suspending has been done or not. |
| */ |
| ! static int sigcont_received; |
| static RETSIGTYPE sigcont_handler __ARGS(SIGPROTOARG); |
| |
| /* |
| --- 1072,1089 ---- |
| SIGRETURN; |
| } |
| |
| ! #if defined(_REENTRANT) && defined(SIGCONT) |
| /* |
| * On Solaris with multi-threading, suspending might not work immediately. |
| * Catch the SIGCONT signal, which will be used as an indication whether the |
| * suspending has been done or not. |
| + * |
| + * On Linux, signal is not always handled immediately either. |
| + * See https://bugs.launchpad.net/bugs/291373 |
| + * |
| + * volatile because it is used in in signal handler sigcont_handler(). |
| */ |
| ! static volatile int sigcont_received; |
| static RETSIGTYPE sigcont_handler __ARGS(SIGPROTOARG); |
| |
| /* |
| |
| *** 1118,1132 **** |
| } |
| # endif |
| |
| ! # ifdef _REENTRANT |
| sigcont_received = FALSE; |
| # endif |
| kill(0, SIGTSTP); /* send ourselves a STOP signal */ |
| ! # ifdef _REENTRANT |
| ! /* When we didn't suspend immediately in the kill(), do it now. Happens |
| ! * on multi-threaded Solaris. */ |
| ! if (!sigcont_received) |
| ! pause(); |
| # endif |
| |
| # ifdef FEAT_TITLE |
| --- 1127,1154 ---- |
| } |
| # endif |
| |
| ! # if defined(_REENTRANT) && defined(SIGCONT) |
| sigcont_received = FALSE; |
| # endif |
| kill(0, SIGTSTP); /* send ourselves a STOP signal */ |
| ! # if defined(_REENTRANT) && defined(SIGCONT) |
| ! /* |
| ! * Wait for the SIGCONT signal to be handled. It generally happens |
| ! * immediately, but somehow not all the time. Do not call pause() |
| ! * because there would be race condition which would hang Vim if |
| ! * signal happened in between the test of sigcont_received and the |
| ! * call to pause(). If signal is not yet received, call sleep(0) |
| ! * to just yield CPU. Signal should then be received. If somehow |
| ! * it's still not received, sleep 1, 2, 3 ms. Don't bother waiting |
| ! * further if signal is not received after 1+2+3+4 ms (not expected |
| ! * to happen). |
| ! */ |
| ! { |
| ! long wait; |
| ! for (wait = 0; !sigcont_received && wait <= 3L; wait++) |
| ! /* Loop is not entered most of the time */ |
| ! mch_delay(wait, FALSE); |
| ! } |
| # endif |
| |
| # ifdef FEAT_TITLE |
| |
| *** 1175,1181 **** |
| #ifdef SIGTSTP |
| signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL); |
| #endif |
| ! #ifdef _REENTRANT |
| signal(SIGCONT, sigcont_handler); |
| #endif |
| |
| --- 1197,1203 ---- |
| #ifdef SIGTSTP |
| signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL); |
| #endif |
| ! #if defined(_REENTRANT) && defined(SIGCONT) |
| signal(SIGCONT, sigcont_handler); |
| #endif |
| |
| |
| *** 1234,1240 **** |
| reset_signals() |
| { |
| catch_signals(SIG_DFL, SIG_DFL); |
| ! #ifdef _REENTRANT |
| /* SIGCONT isn't in the list, because its default action is ignore */ |
| signal(SIGCONT, SIG_DFL); |
| #endif |
| --- 1256,1262 ---- |
| reset_signals() |
| { |
| catch_signals(SIG_DFL, SIG_DFL); |
| ! #if defined(_REENTRANT) && defined(SIGCONT) |
| /* SIGCONT isn't in the list, because its default action is ignore */ |
| signal(SIGCONT, SIG_DFL); |
| #endif |
| |
| *** 5899,5905 **** |
| --- 5921,5929 ---- |
| * we are going to suspend or starting an external process |
| * so we shouldn't have problem with this |
| */ |
| + # ifdef SIGTSTP |
| signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL); |
| + # endif |
| return 1; /* succeed */ |
| } |
| if (gpm_fd == -2) |
| |
| |
| |
| *** 678,679 **** |
| --- 678,681 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 130, |
| /**/ |
| |
| -- |
| hundred-and-one symptoms of being an internet addict: |
| 148. You find it easier to dial-up the National Weather Service |
| Weather/your_town/now.html than to simply look out the window. |
| |
| /// 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 /// |