Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.busybox.net/busybox.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'shell/ash.c')
-rw-r--r--shell/ash.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/shell/ash.c b/shell/ash.c
index e154cc6cc..1764b43c9 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -424,7 +424,11 @@ struct globals_misc {
struct jmploc *exception_handler;
- volatile int suppress_int; /* counter */
+ /*volatile*/ int suppress_int; /* counter */
+ /* ^^^^^^^ removed "volatile" since gcc would turn suppress_int++ into ridiculouls
+ * 3-insn sequence otherwise.
+ * We don't change suppress_int asyncronously (in a signal handler), but we do read it async.
+ */
volatile /*sig_atomic_t*/ smallint pending_int; /* 1 = got SIGINT */
volatile /*sig_atomic_t*/ smallint got_sigchld; /* 1 = got SIGCHLD */
volatile /*sig_atomic_t*/ smallint pending_sig; /* last pending signal */
@@ -717,7 +721,8 @@ int_on(void)
{
barrier();
if (--suppress_int == 0 && pending_int)
- raise_interrupt();
+ raise_interrupt(); /* does not return */
+ barrier();
}
#if DEBUG_INTONOFF
# define INT_ON do { \
@@ -733,7 +738,8 @@ force_int_on(void)
barrier();
suppress_int = 0;
if (pending_int)
- raise_interrupt();
+ raise_interrupt(); /* does not return */
+ barrier();
}
#define FORCE_INT_ON force_int_on()
@@ -743,7 +749,8 @@ force_int_on(void)
barrier(); \
suppress_int = (v); \
if (suppress_int == 0 && pending_int) \
- raise_interrupt(); \
+ raise_interrupt(); /* does not return */ \
+ barrier(); \
} while (0)