summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-10-28 16:49:02 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-10-28 16:49:02 +0000
commita8eeff0feefec4b1eec34980d45c87ac544d1778 (patch)
treeeeceb4d4459f943626bf465cd9b0c5ef75836f6a
parent7807279eaf698474e2eabde440b73a1f587ea7ef (diff)
downloadrockbox-a8eeff0feefec4b1eec34980d45c87ac544d1778.tar.gz
rockbox-a8eeff0feefec4b1eec34980d45c87ac544d1778.zip
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
-rw-r--r--uisimulator/sdl/kernel.c10
1 files changed, 9 insertions, 1 deletions
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;
34 * inside a handler */ 34 * inside a handler */
35static SDL_mutex *sim_irq_mtx; 35static SDL_mutex *sim_irq_mtx;
36static int interrupt_level = HIGHEST_IRQ_LEVEL; 36static int interrupt_level = HIGHEST_IRQ_LEVEL;
37static int handlers_pending = 0;
37static int status_reg = 0; 38static int status_reg = 0;
38 39
39extern struct core_entry cores[NUM_CORES]; 40extern struct core_entry cores[NUM_CORES];
@@ -53,7 +54,8 @@ int set_irq_level(int level)
53 if (status_reg == 0 && level == 0 && oldlevel != 0) 54 if (status_reg == 0 && level == 0 && oldlevel != 0)
54 { 55 {
55 /* Not in a handler and "interrupts" are being reenabled */ 56 /* Not in a handler and "interrupts" are being reenabled */
56 SDL_CondSignal(sim_thread_cond); 57 if (handlers_pending > 0)
58 SDL_CondSignal(sim_thread_cond);
57 } 59 }
58 60
59 interrupt_level = level; /* save new level */ 61 interrupt_level = level; /* save new level */
@@ -65,16 +67,22 @@ int set_irq_level(int level)
65void sim_enter_irq_handler(void) 67void sim_enter_irq_handler(void)
66{ 68{
67 SDL_LockMutex(sim_irq_mtx); 69 SDL_LockMutex(sim_irq_mtx);
70 handlers_pending++;
71
68 if(interrupt_level != 0) 72 if(interrupt_level != 0)
69 { 73 {
70 /* "Interrupts" are disabled. Wait for reenable */ 74 /* "Interrupts" are disabled. Wait for reenable */
71 SDL_CondWait(sim_thread_cond, sim_irq_mtx); 75 SDL_CondWait(sim_thread_cond, sim_irq_mtx);
72 } 76 }
77
73 status_reg = 1; 78 status_reg = 1;
74} 79}
75 80
76void sim_exit_irq_handler(void) 81void sim_exit_irq_handler(void)
77{ 82{
83 if (--handlers_pending > 0)
84 SDL_CondSignal(sim_thread_cond);
85
78 status_reg = 0; 86 status_reg = 0;
79 SDL_UnlockMutex(sim_irq_mtx); 87 SDL_UnlockMutex(sim_irq_mtx);
80} 88}