diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2009-01-08 11:08:22 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2009-01-08 11:08:22 +0000 |
commit | 33a7f3a6cff78ff625621e6a3d4a5728328de0e3 (patch) | |
tree | f7edec5c96d18c4666a1108a3b523ff217cba7dd /uisimulator/sdl/thread-sdl.c | |
parent | cb7e88d3b677dee6948608c944eded256acf37fd (diff) | |
download | rockbox-33a7f3a6cff78ff625621e6a3d4a5728328de0e3.tar.gz rockbox-33a7f3a6cff78ff625621e6a3d4a5728328de0e3.zip |
Allow sims to shut down normally from panic code.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19718 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'uisimulator/sdl/thread-sdl.c')
-rw-r--r-- | uisimulator/sdl/thread-sdl.c | 17 |
1 files changed, 15 insertions, 2 deletions
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 | { |