1
0
Fork 0

(svn r25017) -Fix [FS#5466]: crash after bootstrap download of 32bits base set due to referencing a deleted mutex

release/1.4
rubidium 2013-02-17 20:37:18 +00:00
parent bae033c23d
commit dcf3df65d3
1 changed files with 12 additions and 8 deletions

View File

@ -690,6 +690,7 @@ void VideoDriver_SDL::MainLoop()
if (!_draw_threaded) { if (!_draw_threaded) {
_draw_mutex->EndCritical(); _draw_mutex->EndCritical();
delete _draw_mutex; delete _draw_mutex;
_draw_mutex = NULL;
} else { } else {
/* Wait till the draw mutex has started itself. */ /* Wait till the draw mutex has started itself. */
_draw_mutex->WaitForSignal(); _draw_mutex->WaitForSignal();
@ -757,26 +758,26 @@ void VideoDriver_SDL::MainLoop()
/* The gameloop is the part that can run asynchronously. The rest /* The gameloop is the part that can run asynchronously. The rest
* except sleeping can't. */ * except sleeping can't. */
if (_draw_threaded) _draw_mutex->EndCritical(); if (_draw_mutex != NULL) _draw_mutex->EndCritical();
GameLoop(); GameLoop();
if (_draw_threaded) _draw_mutex->BeginCritical(); if (_draw_mutex != NULL) _draw_mutex->BeginCritical();
UpdateWindows(); UpdateWindows();
_local_palette = _cur_palette; _local_palette = _cur_palette;
} else { } else {
/* Release the thread while sleeping */ /* Release the thread while sleeping */
if (_draw_threaded) _draw_mutex->EndCritical(); if (_draw_mutex != NULL) _draw_mutex->EndCritical();
CSleep(1); CSleep(1);
if (_draw_threaded) _draw_mutex->BeginCritical(); if (_draw_mutex != NULL) _draw_mutex->BeginCritical();
NetworkDrawChatMessage(); NetworkDrawChatMessage();
DrawMouseCursor(); DrawMouseCursor();
} }
/* End of the critical part. */ /* End of the critical part. */
if (_draw_threaded && !HasModalProgress()) { if (_draw_mutex != NULL && !HasModalProgress()) {
_draw_mutex->SendSignal(); _draw_mutex->SendSignal();
} else { } else {
/* Oh, we didn't have threads, then just draw unthreaded */ /* Oh, we didn't have threads, then just draw unthreaded */
@ -785,7 +786,7 @@ void VideoDriver_SDL::MainLoop()
} }
} }
if (_draw_threaded) { if (_draw_mutex != NULL) {
_draw_continue = false; _draw_continue = false;
/* Sending signal if there is no thread blocked /* Sending signal if there is no thread blocked
* is very valid and results in noop */ * is very valid and results in noop */
@ -795,14 +796,17 @@ void VideoDriver_SDL::MainLoop()
delete _draw_mutex; delete _draw_mutex;
delete _draw_thread; delete _draw_thread;
_draw_mutex = NULL;
_draw_thread = NULL;
} }
} }
bool VideoDriver_SDL::ChangeResolution(int w, int h) bool VideoDriver_SDL::ChangeResolution(int w, int h)
{ {
if (_draw_threaded) _draw_mutex->BeginCritical(); if (_draw_mutex != NULL) _draw_mutex->BeginCritical();
bool ret = CreateMainSurface(w, h); bool ret = CreateMainSurface(w, h);
if (_draw_threaded) _draw_mutex->EndCritical(); if (_draw_mutex != NULL) _draw_mutex->EndCritical();
return ret; return ret;
} }