From 7ab65008247e683d847a5def4037b894c71ff3c7 Mon Sep 17 00:00:00 2001 From: Jeff Dike Date: Mon, 4 Feb 2008 22:31:09 -0800 Subject: [PATCH] --- yaml --- r: 83205 b: refs/heads/master c: fce8c41c9f68b9af36f3076bae8f1d469a6e7aab h: refs/heads/master i: 83203: 5f7e98026077230600bfd81540cbcd6e9b8255dd v: v3 --- [refs] | 2 +- trunk/arch/um/os-Linux/signal.c | 28 ++++++++-------------------- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/[refs] b/[refs] index 9d385e622d0c..d50cfd360d11 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0983a88b9f0ceffb2116ce92c7b273ce2aec7b93 +refs/heads/master: fce8c41c9f68b9af36f3076bae8f1d469a6e7aab diff --git a/trunk/arch/um/os-Linux/signal.c b/trunk/arch/um/os-Linux/signal.c index 7ff8f57b7150..62a66f38a913 100644 --- a/trunk/arch/um/os-Linux/signal.c +++ b/trunk/arch/um/os-Linux/signal.c @@ -15,6 +15,9 @@ #include "sysdep/sigcontext.h" #include "user.h" +/* Copied from linux/compiler-gcc.h since we can't include it directly */ +#define barrier() __asm__ __volatile__("": : :"memory") + /* * These are the asynchronous signals. SIGPROF is excluded because we want to * be able to profile all of UML, not just the non-critical sections. If @@ -27,13 +30,8 @@ #define SIGVTALRM_BIT 1 #define SIGVTALRM_MASK (1 << SIGVTALRM_BIT) -/* - * These are used by both the signal handlers and - * block/unblock_signals. I don't want modifications cached in a - * register - they must go straight to memory. - */ -static volatile int signals_enabled = 1; -static volatile int pending = 0; +static int signals_enabled; +static unsigned int pending; void sig_handler(int sig, struct sigcontext *sc) { @@ -198,7 +196,7 @@ void block_signals(void) * This might matter if gcc figures out how to inline this and * decides to shuffle this code into the caller. */ - mb(); + barrier(); } void unblock_signals(void) @@ -224,21 +222,11 @@ void unblock_signals(void) * Setting signals_enabled and reading pending must * happen in this order. */ - mb(); + barrier(); save_pending = pending; - if (save_pending == 0) { - /* - * This must return with signals enabled, so - * this barrier ensures that writes are - * flushed out before the return. This might - * matter if gcc figures out how to inline - * this (unlikely, given its size) and decides - * to shuffle this code into the caller. - */ - mb(); + if (save_pending == 0) return; - } pending = 0;