diff --git a/src/conio/ciolib.c b/src/conio/ciolib.c index 68a57a4af0c44aa5aed7e3b521b6dc9014d4be76..eaba484743be1cddbc4d876415c2bff86c1346e9 100644 --- a/src/conio/ciolib.c +++ b/src/conio/ciolib.c @@ -2028,8 +2028,8 @@ void main_stub(void *argptr) args->ret = CIOLIB_main(args->argc, args->argv); args->no_sdl = 1; sem_post(&startsdl_sem); - sem_post(&main_sem); exit_sdl_con(); + sem_post(&main_sem); } int main(int argc, char **argv) diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c index 055dc33ee1b1e0aa53a269cc6344e7c221262c88..47602f600673a5f84933ac98b08a406a073e1d9b 100644 --- a/src/conio/sdl_con.c +++ b/src/conio/sdl_con.c @@ -69,6 +69,7 @@ int sdl_init_good=0; pthread_mutex_t sdl_keylock; sem_t sdl_key_pending; static unsigned int sdl_pending_mousekeys=0; +static bool sdl_sync_initialized; struct sdl_keyvals { int keysym @@ -193,6 +194,7 @@ const struct sdl_keyvals sdl_keyval[] = void sdl_video_event_thread(void *data); static void setup_surfaces(struct video_stats *vs); +static int sdl_initsync(void); static void sdl_user_func(int func, ...) { @@ -294,10 +296,9 @@ void exit_sdl_con(void) { // Avoid calling exit(0) from an atexit() function... ciolib_reaper = 0; - if (sdl_init_good) - sdl_user_func_ret(SDL_USEREVENT_QUIT); - else - exit(0); + if (!sdl_sync_initialized) + sdl_initsync(); + sdl_user_func_ret(SDL_USEREVENT_QUIT); } void sdl_copytext(const char *text, size_t buflen) @@ -1030,7 +1031,7 @@ void sdl_video_event_thread(void *data) if (sdl_init_good) sdl_add_key(CIO_KEY_QUIT, &cvstat); else - exit(0); + return; } break; case SDL_WINDOWEVENT: @@ -1273,7 +1274,8 @@ void sdl_video_event_thread(void *data) return; } -int sdl_initciolib(int mode) +static int +sdl_initsync(void) { #if defined(__DARWIN__) if (initsdl_ret) { @@ -1291,6 +1293,14 @@ int sdl_initciolib(int mode) pthread_mutex_init(&win_mutex, NULL); pthread_mutex_init(&sdl_keylock, NULL); pthread_mutex_init(&sdl_mode_mutex, NULL); + sdl_sync_initialized = true; + return 0; +} + +int sdl_initciolib(int mode) +{ + if (sdl_initsync() == -1) + return -1; return(sdl_init(mode)); }