From f76cfe56d9bc281685c5120bf765d29d9323756f Mon Sep 17 00:00:00 2001 From: Riku Voipio Date: Fri, 4 Dec 2009 15:16:30 +0200 Subject: linux-user: enable tb unlinking when compiled with NPTL Fixes receiving signals when guest code is being executed in a tight loop. For an example, try interrupting the following code with ctrl-c. http://nchipin.kos.to/test-loop.c The tight loop is ofcourse brainless, but it is also exactly how the waitpid* testcases are implemented. Signed-off-by: Riku Voipio Signed-off-by: Aurelien Jarno --- exec.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'exec.c') diff --git a/exec.c b/exec.c index 21a02f6c45..1190591e93 100644 --- a/exec.c +++ b/exec.c @@ -1530,24 +1530,22 @@ void cpu_set_log_filename(const char *filename) static void cpu_unlink_tb(CPUState *env) { -#if defined(CONFIG_USE_NPTL) /* FIXME: TB unchaining isn't SMP safe. For now just ignore the problem and hope the cpu will stop of its own accord. For userspace emulation this often isn't actually as bad as it sounds. Often signals are used primarily to interrupt blocking syscalls. */ -#else TranslationBlock *tb; static spinlock_t interrupt_lock = SPIN_LOCK_UNLOCKED; tb = env->current_tb; /* if the cpu is currently executing code, we must unlink it and all the potentially executing TB */ - if (tb && !testandset(&interrupt_lock)) { + if (tb) { + spin_lock(&interrupt_lock); env->current_tb = NULL; tb_reset_jump_recursive(tb); - resetlock(&interrupt_lock); + spin_unlock(&interrupt_lock); } -#endif } /* mask must never be zero, except for A20 change call */ -- cgit v1.2.3-55-g7522