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,