diff options
Diffstat (limited to 'uisimulator/sdl')
-rw-r--r-- | uisimulator/sdl/thread-sdl.c | 17 | ||||
-rw-r--r-- | uisimulator/sdl/thread-sdl.h | 1 |
2 files changed, 16 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 | { |
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 */ |