summaryrefslogtreecommitdiff
path: root/firmware/target/hosted/sdl/system-sdl.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/hosted/sdl/system-sdl.c')
-rw-r--r--firmware/target/hosted/sdl/system-sdl.c37
1 files changed, 11 insertions, 26 deletions
diff --git a/firmware/target/hosted/sdl/system-sdl.c b/firmware/target/hosted/sdl/system-sdl.c
index 7ab6fd2c34..d6c0dfa345 100644
--- a/firmware/target/hosted/sdl/system-sdl.c
+++ b/firmware/target/hosted/sdl/system-sdl.c
@@ -76,17 +76,6 @@ void sys_poweroff(void)
76void gui_message_loop(void); 76void gui_message_loop(void);
77 77
78/* 78/*
79 * This callback let's the main thread run again after SDL has been initialized
80 **/
81static uint32_t cond_signal(uint32_t interval, void *param)
82{
83 (void)interval;
84 SDL_cond *c = (SDL_cond*)param;
85 /* remove timer, CondSignal returns 0 on success */
86 return SDL_CondSignal(c);
87}
88
89/*
90 * This thread will read the buttons in an interrupt like fashion, and 79 * This thread will read the buttons in an interrupt like fashion, and
91 * also initializes SDL_INIT_VIDEO and the surfaces 80 * also initializes SDL_INIT_VIDEO and the surfaces
92 * 81 *
@@ -143,9 +132,9 @@ static int sdl_event_thread(void * param)
143 if (background && picture_surface != NULL) 132 if (background && picture_surface != NULL)
144 SDL_BlitSurface(picture_surface, NULL, gui_surface, NULL); 133 SDL_BlitSurface(picture_surface, NULL, gui_surface, NULL);
145 134
146 /* calling SDL_CondSignal() right away here doesn't work reliably so 135 /* let system_init proceed */
147 * post-pone it a bit */ 136 SDL_SemPost((SDL_sem *)param);
148 SDL_AddTimer(100, cond_signal, param); 137
149 /* 138 /*
150 * finally enter the button loop */ 139 * finally enter the button loop */
151 while(1) 140 while(1)
@@ -157,26 +146,22 @@ static int sdl_event_thread(void * param)
157 146
158void system_init(void) 147void system_init(void)
159{ 148{
160 SDL_cond *c; 149 SDL_sem *s;
161 SDL_mutex *m; 150
162 if (SDL_Init(SDL_INIT_TIMER)) 151 if (SDL_Init(SDL_INIT_TIMER))
163 panicf("%s", SDL_GetError()); 152 panicf("%s", SDL_GetError());
164 atexit(sys_poweroff); 153 atexit(sys_poweroff);
165 154
166 c = SDL_CreateCond(); 155 s = SDL_CreateSemaphore(0); /* 0-count so it blocks */
167 m = SDL_CreateMutex();
168 156
169 SDL_CreateThread(sdl_event_thread, c); 157 SDL_CreateThread(sdl_event_thread, s);
170 158
171 /* Lock mutex and wait for sdl_event_thread to run so that it can 159 /* wait for sdl_event_thread to run so that it can initialize the surfaces
172 * initialize the surfaces and video subsystem needed for SDL events */ 160 * and video subsystem needed for SDL events */
173 SDL_LockMutex(m); 161 SDL_SemWait(s);
174 SDL_CondWait(c, m);
175 SDL_UnlockMutex(m);
176 162
177 /* cleanup */ 163 /* cleanup */
178 SDL_DestroyCond(c); 164 SDL_DestroySemaphore(s);
179 SDL_DestroyMutex(m);
180} 165}
181 166
182void system_exception_wait(void) 167void system_exception_wait(void)