From a8eeff0feefec4b1eec34980d45c87ac544d1778 Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Sun, 28 Oct 2007 16:49:02 +0000 Subject: Improve the fake interrupt stuff on the sim a bit. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15349 a1c6a512-1295-4272-9138-f99709370657 --- uisimulator/sdl/kernel.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/uisimulator/sdl/kernel.c b/uisimulator/sdl/kernel.c index 220d069721..7126b82072 100644 --- a/uisimulator/sdl/kernel.c +++ b/uisimulator/sdl/kernel.c @@ -34,6 +34,7 @@ static SDL_cond *sim_thread_cond; * inside a handler */ static SDL_mutex *sim_irq_mtx; static int interrupt_level = HIGHEST_IRQ_LEVEL; +static int handlers_pending = 0; static int status_reg = 0; extern struct core_entry cores[NUM_CORES]; @@ -53,7 +54,8 @@ int set_irq_level(int level) if (status_reg == 0 && level == 0 && oldlevel != 0) { /* Not in a handler and "interrupts" are being reenabled */ - SDL_CondSignal(sim_thread_cond); + if (handlers_pending > 0) + SDL_CondSignal(sim_thread_cond); } interrupt_level = level; /* save new level */ @@ -65,16 +67,22 @@ int set_irq_level(int level) void sim_enter_irq_handler(void) { SDL_LockMutex(sim_irq_mtx); + handlers_pending++; + if(interrupt_level != 0) { /* "Interrupts" are disabled. Wait for reenable */ SDL_CondWait(sim_thread_cond, sim_irq_mtx); } + status_reg = 1; } void sim_exit_irq_handler(void) { + if (--handlers_pending > 0) + SDL_CondSignal(sim_thread_cond); + status_reg = 0; SDL_UnlockMutex(sim_irq_mtx); } -- cgit