diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c
index 750e1bb1bdeccba1648457deb9a6cf50c963d43c..8dcab0aea6fd61e46e7ad6312e9a55be3a152e8d 100644
--- a/src/conio/sdl_con.c
+++ b/src/conio/sdl_con.c
@@ -391,7 +391,8 @@ void sdl_user_func(int func, ...)
 				return;
 			}
 			*(unsigned long *)ev.user.data2=va_arg(argptr, unsigned long);
-			while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1);
+			while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1)
+				YIELD();
 			break;
 		case SDL_USEREVENT_SETNAME:
 		case SDL_USEREVENT_SETTITLE:
@@ -399,17 +400,20 @@ void sdl_user_func(int func, ...)
 				va_end(argptr);
 				return;
 			}
-			while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1);
+			while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1)
+				YIELD();
 			break;
 		case SDL_USEREVENT_UPDATERECT:
 			ev.user.data1=va_arg(argptr, struct update_rect *);
-			while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1);
+			while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1)
+				YIELD();
 			break;
 		case SDL_USEREVENT_COPY:
 		case SDL_USEREVENT_PASTE:
 		case SDL_USEREVENT_SHOWMOUSE:
 		case SDL_USEREVENT_HIDEMOUSE:
-			while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1);
+			while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1)
+				YIELD();
 			break;
 	}
 	va_end(argptr);
@@ -428,20 +432,26 @@ int sdl_user_func_ret(int func, ...)
 	ev.user.data2=NULL;
 	ev.user.code=func;
 	va_start(argptr, func);
-	switch(func) {
-		case SDL_USEREVENT_SETVIDMODE:
-		case SDL_USEREVENT_FLUSH:
-		case SDL_USEREVENT_INIT:
-		case SDL_USEREVENT_QUIT:
-			while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1);
-			passed=TRUE;
+	while(1) {
+		switch(func) {
+			case SDL_USEREVENT_SETVIDMODE:
+			case SDL_USEREVENT_FLUSH:
+			case SDL_USEREVENT_INIT:
+			case SDL_USEREVENT_QUIT:
+				while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1)
+					YIELD();
+				passed=TRUE;
+				break;
+		}
+		if(passed) {
+			if(sdl.SemWaitTimeout(sdl_ufunc_ret, 100)==0)
+				break;
+		}
+		else {
+			sdl_ufunc_retval=-1;
 			break;
+		}
 	}
-	if(passed) {
-		sdl.SemWait(sdl_ufunc_ret);
-	}
-	else
-		sdl_ufunc_retval=-1;
 	va_end(argptr);
 	sdl.mutexV(funcret_mutex);
 	return(sdl_ufunc_retval);
diff --git a/src/conio/sdlfuncs.c b/src/conio/sdlfuncs.c
index ea1057160bb08bef64fa8375cdb0b5523d9ea6a6..66342dab4194b2778c47fd3ae965b91d3eb47cfa 100644
--- a/src/conio/sdlfuncs.c
+++ b/src/conio/sdlfuncs.c
@@ -78,6 +78,10 @@ int load_sdl_funcs(struct sdlfuncs *sdlf)
 		xp_dlclose(sdl_dll);
 		return(-1);
 	}
+	if((sdlf->SemWaitTimeout=xp_dlsym(sdl_dll, SDL_SemWaitTimeout))==NULL) {
+		xp_dlclose(sdl_dll);
+		return(-1);
+	}
 	if((sdlf->SemPost=xp_dlsym(sdl_dll, SDL_SemPost))==NULL) {
 		xp_dlclose(sdl_dll);
 		return(-1);
diff --git a/src/conio/sdlfuncs.h b/src/conio/sdlfuncs.h
index b3d8f12d2ffcc503ef3b957d383fd120ac59ac73..ad51141ea0d863c7f3f7360163784895eea46ec2 100644
--- a/src/conio/sdlfuncs.h
+++ b/src/conio/sdlfuncs.h
@@ -21,6 +21,7 @@ struct sdlfuncs {
 					SDL_eventaction action, Uint32 mask);
 	char	*(HACK_HACK_HACK *VideoDriverName)	(char *namebuf, int maxlen);
 	int	(HACK_HACK_HACK *SemWait)	(SDL_sem *sem);
+	int	(HACK_HACK_HACK *SemWaitTimeout)(SDL_sem *sem, Uint32 timeout);
 	int	(HACK_HACK_HACK *SemPost)	(SDL_sem *sem);
 	Uint8	(HACK_HACK_HACK *EventState)	(Uint8 type, int state);
 	SDL_Surface	*(HACK_HACK_HACK *CreateRGBSurface)	(Uint32 flags, int width, int height, int depth,
diff --git a/src/xpdev/sdlfuncs.c b/src/xpdev/sdlfuncs.c
index bf4fe3ad9ca6cfb04d110b253d3b70a8dc3a344c..d1f00eafa211912db769c4f9133a8072d8e8bb9d 100644
--- a/src/xpdev/sdlfuncs.c
+++ b/src/xpdev/sdlfuncs.c
@@ -78,6 +78,10 @@ int load_sdl_funcs(struct sdlfuncs *sdlf)
 		xp_dlclose(sdl_dll);
 		return(-1);
 	}
+	if((sdlf->SemWaitTimeout=xp_dlsym(sdl_dll, SDL_SemWaitTimeout))==NULL) {
+		xp_dlclose(sdl_dll);
+		return(-1);
+	}
 	if((sdlf->SemPost=xp_dlsym(sdl_dll, SDL_SemPost))==NULL) {
 		xp_dlclose(sdl_dll);
 		return(-1);
diff --git a/src/xpdev/sdlfuncs.h b/src/xpdev/sdlfuncs.h
index 996da4a4b92c589df38cf4569a2eac6a649724db..b8ba1e1734a4400893952b1142df1c05afa98abc 100644
--- a/src/xpdev/sdlfuncs.h
+++ b/src/xpdev/sdlfuncs.h
@@ -15,6 +15,7 @@ struct sdlfuncs {
 					SDL_eventaction action, Uint32 mask);
 	char	*(*VideoDriverName)	(char *namebuf, int maxlen);
 	int	(*SemWait)	(SDL_sem *sem);
+	int	(*SemWaitTimeout)	(SDL_sem *sem, Uint32 timeout);
 	int	(*SemPost)	(SDL_sem *sem);
 	Uint8	(*EventState)	(Uint8 type, int state);
 	SDL_Surface	*(*CreateRGBSurface)	(Uint32 flags, int width, int height, int depth,