From 3c05ba56c5963264f49c75499dc726a85fbf59e3 Mon Sep 17 00:00:00 2001 From: deuce <> Date: Sat, 25 Apr 2020 18:45:01 +0000 Subject: [PATCH] More hackery to ensure SDL_Init() is called from the main() function. --- src/conio/ciolib.c | 14 +++++++++++++- src/conio/ciolib.h | 3 +++ src/conio/sdl_con.c | 8 +++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/conio/ciolib.c b/src/conio/ciolib.c index 0e21e89aad..779f3dbab0 100644 --- a/src/conio/ciolib.c +++ b/src/conio/ciolib.c @@ -1882,7 +1882,11 @@ CIOLIBEXPORT enum ciolib_codepage CIOLIBCALL ciolib_getcodepage(void) #endif sem_t initsdl_sem; +sem_t initsdldone_sem; +sem_t startsdl_sem; sem_t main_sem; +int initsdl_ret = -1; + struct main_args { int argc; char **argv; @@ -1897,6 +1901,7 @@ void main_stub(void *argptr) args->ret = CIOLIB_main(args->argc, args->argv); args->no_sdl = 1; sem_post(&initsdl_sem); + sem_post(&startsdl_sem); sem_post(&main_sem); exit_sdl_con(); } @@ -1906,11 +1911,18 @@ int main(int argc, char **argv) struct main_args ma = {argc, argv, -1, 0}; sem_init(&initsdl_sem, 0, 0); + sem_init(&initsdldone_sem, 0, 0); + sem_init(&startsdl_sem, 0, 0); sem_init(&main_sem, 0, 0); _beginthread(main_stub, 0, &ma); sem_wait(&initsdl_sem); if (!ma.no_sdl) { - sdl_video_event_thread(NULL); + initsdl_ret = init_sdl_video(); + sem_post(&initsdldone_sem); + if (initsdl_ret != -1) { + sem_wait(&startsdl_sem); + sdl_video_event_thread(NULL); + } } sem_wait(&main_sem); return ma.ret; diff --git a/src/conio/ciolib.h b/src/conio/ciolib.h index 47600d71e9..53ea90adca 100644 --- a/src/conio/ciolib.h +++ b/src/conio/ciolib.h @@ -561,6 +561,9 @@ CIOLIBEXPORT void CIOLIBCALL ansi_ciolib_setdoorway(int enable); #if defined(__DARWIN__) extern sem_t initsdl_sem; extern sem_t main_sem; + extern sem_t startsdl_sem; + extern sem_t initsdldone_sem; + extern int initsdl_ret; #endif #endif diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c index ae3a6c183c..d7c46a075c 100644 --- a/src/conio/sdl_con.c +++ b/src/conio/sdl_con.c @@ -372,7 +372,7 @@ int sdl_init(int mode) fullscreen=1; // Needs to be *after* bitmap_drv_init() #if defined(__DARWIN__) - sem_post(&initsdl_sem); + sem_post(&startsdl_sem); #else _beginthread(sdl_video_event_thread, 0, NULL); #endif @@ -1058,7 +1058,13 @@ void sdl_video_event_thread(void *data) int sdl_initciolib(int mode) { +#if defined(__DARWIN__) + sem_post(&initsdl_sem); + sem_wait(&initsdldone_sem); + if (initsdl_ret) { +#else if(init_sdl_video()) { +#endif fprintf(stderr,"SDL Video Initialization Failed\n"); return(-1); } -- GitLab