To: vim-dev@vim.org Subject: Patch 7.2.130 Fcc: outbox From: Bram Moolenaar 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 *** ../vim-7.2.129/src/auto/configure Thu Nov 20 10:36:04 2008 --- src/auto/configure Mon Mar 2 02:36:52 2009 *************** *** 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 *** ../vim-7.2.129/src/configure.in Thu Nov 20 10:36:04 2008 --- src/configure.in Sun Feb 22 21:47:44 2009 *************** *** 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 *** ../vim-7.2.129/src/config.h.in Tue Jun 24 23:47:46 2008 --- src/config.h.in Mon Feb 23 00:13:17 2009 *************** *** 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 doesn't define. */ #undef mode_t *** ../vim-7.2.129/src/globals.h Tue Jan 6 16:13:42 2009 --- src/globals.h Mon Mar 2 02:40:16 2009 *************** *** 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 */ *** ../vim-7.2.129/src/os_unix.c Sun Feb 22 02:51:37 2009 --- src/os_unix.c Mon Mar 2 01:05:50 2009 *************** *** 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) *** ../vim-7.2.129/src/version.c Mon Mar 2 02:11:09 2009 --- src/version.c Mon Mar 2 02:36:00 2009 *************** *** 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 ///