From: divverent Date: Sun, 5 Apr 2009 10:53:43 +0000 (+0000) Subject: graceful handling of stack underflows, or host_abortframe, during loading X-Git-Tag: xonotic-v0.1.0preview~1736 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=68a626d1c60d627aa438da95fef86cad0f1bca2d;p=xonotic%2Fdarkplaces.git graceful handling of stack underflows, or host_abortframe, during loading git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8871 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/cl_screen.c b/cl_screen.c index 79088733..3d75c0b8 100644 --- a/cl_screen.c +++ b/cl_screen.c @@ -1707,6 +1707,13 @@ void SCR_PushLoadingScreen (qboolean redraw, const char *msg, float len_in_paren void SCR_PopLoadingScreen (qboolean redraw) { loadingscreenstack_t *s = loadingscreenstack; + + if(!s) + { + Con_DPrintf("Popping a loading screen item from an empty stack!\n"); + return; + } + loadingscreenstack = s->prev; if(s->prev) s->prev->relative_completion = (s->absolute_loading_amount_min + s->absolute_loading_amount_len - s->prev->absolute_loading_amount_min) / s->prev->absolute_loading_amount_len; @@ -1716,6 +1723,12 @@ void SCR_PopLoadingScreen (qboolean redraw) SCR_UpdateLoadingScreenIfShown(); } +void SCR_ClearLoadingScreen (qboolean redraw) +{ + while(loadingscreenstack) + SCR_PopLoadingScreen(redraw && !loadingscreenstack->prev); +} + static float SCR_DrawLoadingStack_r(loadingscreenstack_t *s, float y) { float size = 8; diff --git a/host.c b/host.c index c8521f27..0dea16e6 100644 --- a/host.c +++ b/host.c @@ -619,7 +619,10 @@ void Host_Main(void) for (;;) { if (setjmp(host_abortframe)) + { + SCR_ClearLoadingScreen(false); continue; // something bad happened, or the server disconnected + } oldrealtime = realtime; realtime = Sys_DoubleTime(); diff --git a/screen.h b/screen.h index 3efbd7a9..4a333019 100644 --- a/screen.h +++ b/screen.h @@ -35,6 +35,7 @@ void SCR_UpdateLoadingScreenIfShown(); // pushes an item on the loading screen void SCR_PushLoadingScreen (qboolean redraw, const char *msg, float len_in_parent); void SCR_PopLoadingScreen (qboolean redraw); +void SCR_ClearLoadingScreen (qboolean redraw); extern float scr_con_current; // current height of displayed console