diff options
-rw-r--r-- | uisimulator/common/stubs.c | 4 | ||||
-rw-r--r-- | uisimulator/sdl/thread-sdl.c | 17 | ||||
-rw-r--r-- | uisimulator/sdl/thread-sdl.h | 1 |
3 files changed, 18 insertions, 4 deletions
diff --git a/uisimulator/common/stubs.c b/uisimulator/common/stubs.c index 12b6f293a4..58e18392bc 100644 --- a/uisimulator/common/stubs.c +++ b/uisimulator/common/stubs.c | |||
@@ -342,12 +342,12 @@ void touchpad_set_sensitivity(int level) | |||
342 | 342 | ||
343 | void system_exception_wait(void) | 343 | void system_exception_wait(void) |
344 | { | 344 | { |
345 | while(1); | 345 | thread_sdl_exception_wait(); |
346 | } | 346 | } |
347 | 347 | ||
348 | void system_reboot(void) | 348 | void system_reboot(void) |
349 | { | 349 | { |
350 | while(1); | 350 | thread_sdl_exception_wait(); |
351 | } | 351 | } |
352 | 352 | ||
353 | /* assure an unused place to direct virtual pointers to */ | 353 | /* assure an unused place to direct virtual pointers to */ |
diff --git a/uisimulator/sdl/thread-sdl.c b/uisimulator/sdl/thread-sdl.c index ab1086dd7d..1522f318a6 100644 --- a/uisimulator/sdl/thread-sdl.c +++ b/uisimulator/sdl/thread-sdl.c | |||
@@ -64,15 +64,18 @@ extern long start_tick; | |||
64 | void thread_sdl_shutdown(void) | 64 | void thread_sdl_shutdown(void) |
65 | { | 65 | { |
66 | int i; | 66 | int i; |
67 | /* Take control */ | ||
68 | SDL_LockMutex(m); | ||
69 | 67 | ||
70 | /* Tell all threads jump back to their start routines, unlock and exit | 68 | /* Tell all threads jump back to their start routines, unlock and exit |
71 | gracefully - we'll check each one in turn for it's status. Threads | 69 | gracefully - we'll check each one in turn for it's status. Threads |
72 | _could_ terminate via remove_thread or multiple threads could exit | 70 | _could_ terminate via remove_thread or multiple threads could exit |
73 | on each unlock but that is safe. */ | 71 | on each unlock but that is safe. */ |
72 | |||
73 | /* Do this before trying to acquire lock */ | ||
74 | threads_exit = true; | 74 | threads_exit = true; |
75 | 75 | ||
76 | /* Take control */ | ||
77 | SDL_LockMutex(m); | ||
78 | |||
76 | for (i = 0; i < MAXTHREADS; i++) | 79 | for (i = 0; i < MAXTHREADS; i++) |
77 | { | 80 | { |
78 | struct thread_entry *thread = &threads[i]; | 81 | struct thread_entry *thread = &threads[i]; |
@@ -200,6 +203,16 @@ bool thread_sdl_init(void *param) | |||
200 | return true; | 203 | return true; |
201 | } | 204 | } |
202 | 205 | ||
206 | void thread_sdl_exception_wait(void) | ||
207 | { | ||
208 | while (1) | ||
209 | { | ||
210 | SDL_Delay(HZ/10); | ||
211 | if (threads_exit) | ||
212 | thread_exit(); | ||
213 | } | ||
214 | } | ||
215 | |||
203 | /* A way to yield and leave the threading system for extended periods */ | 216 | /* A way to yield and leave the threading system for extended periods */ |
204 | void thread_sdl_thread_lock(void *me) | 217 | void thread_sdl_thread_lock(void *me) |
205 | { | 218 | { |
diff --git a/uisimulator/sdl/thread-sdl.h b/uisimulator/sdl/thread-sdl.h index b88ba50f8c..f221aa5a72 100644 --- a/uisimulator/sdl/thread-sdl.h +++ b/uisimulator/sdl/thread-sdl.h | |||
@@ -27,6 +27,7 @@ | |||
27 | extern SDL_Thread *gui_thread; /* The "main" thread */ | 27 | extern SDL_Thread *gui_thread; /* The "main" thread */ |
28 | void thread_sdl_thread_lock(void *me); | 28 | void thread_sdl_thread_lock(void *me); |
29 | void * thread_sdl_thread_unlock(void); | 29 | void * thread_sdl_thread_unlock(void); |
30 | void thread_sdl_exception_wait(void); | ||
30 | bool thread_sdl_init(void *param); /* Init the sim threading API - thread created calls app_main */ | 31 | bool thread_sdl_init(void *param); /* Init the sim threading API - thread created calls app_main */ |
31 | void thread_sdl_shutdown(void); /* Shut down all kernel threads gracefully */ | 32 | void thread_sdl_shutdown(void); /* Shut down all kernel threads gracefully */ |
32 | void thread_sdl_lock(void); /* Sync with SDL threads */ | 33 | void thread_sdl_lock(void); /* Sync with SDL threads */ |