diff --git a/src/conio/ciolib.c b/src/conio/ciolib.c
index 0e21e89aad67bbceae6594862e61e9bb0fec39c2..779f3dbab023694382d7020dc23a3df7e8267234 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 47600d71e96a468487ce645e9f844fffd84066f7..53ea90adca2ace7aa0ae2c1c7d900bf56f9d16e8 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 ae3a6c183c9843ff378d3fdeddffad528d0bbfb5..d7c46a075c2a67c3dfb9aec2e39c8f7e59d86a87 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);
 	}