diff options
Diffstat (limited to 'uisimulator/sdl/uisdl.c')
-rw-r--r-- | uisimulator/sdl/uisdl.c | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/uisimulator/sdl/uisdl.c b/uisimulator/sdl/uisdl.c index fdd40beb23..eada01f99a 100644 --- a/uisimulator/sdl/uisdl.c +++ b/uisimulator/sdl/uisdl.c | |||
@@ -19,6 +19,7 @@ | |||
19 | 19 | ||
20 | #include <stdlib.h> | 20 | #include <stdlib.h> |
21 | #include <string.h> | 21 | #include <string.h> |
22 | #include <setjmp.h> | ||
22 | #include "autoconf.h" | 23 | #include "autoconf.h" |
23 | #include "button.h" | 24 | #include "button.h" |
24 | #include "thread.h" | 25 | #include "thread.h" |
@@ -41,7 +42,7 @@ | |||
41 | extern void app_main (void *); /* mod entry point */ | 42 | extern void app_main (void *); /* mod entry point */ |
42 | extern void new_key(int key); | 43 | extern void new_key(int key); |
43 | extern void sim_tick_tasks(void); | 44 | extern void sim_tick_tasks(void); |
44 | extern void sim_io_init(void); | 45 | extern bool sim_io_init(void); |
45 | extern void sim_io_shutdown(void); | 46 | extern void sim_io_shutdown(void); |
46 | 47 | ||
47 | void button_event(int key, bool pressed); | 48 | void button_event(int key, bool pressed); |
@@ -49,7 +50,6 @@ void button_event(int key, bool pressed); | |||
49 | SDL_Surface *gui_surface; | 50 | SDL_Surface *gui_surface; |
50 | bool background = false; /* Don't use backgrounds by default */ | 51 | bool background = false; /* Don't use backgrounds by default */ |
51 | 52 | ||
52 | SDL_Thread *gui_thread; | ||
53 | SDL_TimerID tick_timer_id; | 53 | SDL_TimerID tick_timer_id; |
54 | 54 | ||
55 | bool lcd_display_redraw = true; /* Used for player simulator */ | 55 | bool lcd_display_redraw = true; /* Used for player simulator */ |
@@ -170,21 +170,13 @@ bool gui_startup(void) | |||
170 | bool gui_shutdown(void) | 170 | bool gui_shutdown(void) |
171 | { | 171 | { |
172 | SDL_RemoveTimer(tick_timer_id); | 172 | SDL_RemoveTimer(tick_timer_id); |
173 | kill_sim_threads(); | 173 | /* Order here is relevent to prevent deadlocks and use of destroyed |
174 | sync primitives by kernel threads */ | ||
175 | thread_sdl_shutdown(); | ||
174 | sim_io_shutdown(); | 176 | sim_io_shutdown(); |
175 | return true; | 177 | return true; |
176 | } | 178 | } |
177 | 179 | ||
178 | /** | ||
179 | * Thin wrapper around normal app_main() to stop gcc complaining about types. | ||
180 | */ | ||
181 | int sim_app_main(void *param) | ||
182 | { | ||
183 | app_main(param); | ||
184 | |||
185 | return 0; | ||
186 | } | ||
187 | |||
188 | #if defined(WIN32) && defined(main) | 180 | #if defined(WIN32) && defined(main) |
189 | /* Don't use SDL_main on windows -> no more stdio redirection */ | 181 | /* Don't use SDL_main on windows -> no more stdio redirection */ |
190 | #undef main | 182 | #undef main |
@@ -231,14 +223,19 @@ int main(int argc, char *argv[]) | |||
231 | background = false; | 223 | background = false; |
232 | } | 224 | } |
233 | 225 | ||
234 | sim_io_init(); | 226 | if (!sim_io_init()) { |
227 | fprintf(stderr, "sim_io_init failed\n"); | ||
228 | return -1; | ||
229 | } | ||
235 | 230 | ||
236 | if (!gui_startup()) | 231 | if (!gui_startup()) { |
232 | fprintf(stderr, "gui_startup failed\n"); | ||
237 | return -1; | 233 | return -1; |
234 | } | ||
238 | 235 | ||
239 | gui_thread = SDL_CreateThread(sim_app_main, NULL); | 236 | /* app_main will be called by the new main thread */ |
240 | if (gui_thread == NULL) { | 237 | if (!thread_sdl_init(NULL)) { |
241 | printf("Error creating GUI thread!\n"); | 238 | fprintf(stderr, "thread_sdl_init failed\n"); |
242 | return -1; | 239 | return -1; |
243 | } | 240 | } |
244 | 241 | ||