summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2013-02-17 20:37:18 +0000
committerrubidium <rubidium@openttd.org>2013-02-17 20:37:18 +0000
commitdcf3df65d3cddb043d8eed8724e7e06edd84e557 (patch)
treeafce7d7dcab88018bf477b9915fc460e69245c03 /src
parentbae033c23dea6d3f97f66f26e3e6f2ebc48b8d34 (diff)
downloadopenttd-dcf3df65d3cddb043d8eed8724e7e06edd84e557.tar.xz
(svn r25017) -Fix [FS#5466]: crash after bootstrap download of 32bits base set due to referencing a deleted mutex
Diffstat (limited to 'src')
-rw-r--r--src/video/sdl_v.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/video/sdl_v.cpp b/src/video/sdl_v.cpp
index ba2786dbe..a9b909b82 100644
--- a/src/video/sdl_v.cpp
+++ b/src/video/sdl_v.cpp
@@ -690,6 +690,7 @@ void VideoDriver_SDL::MainLoop()
if (!_draw_threaded) {
_draw_mutex->EndCritical();
delete _draw_mutex;
+ _draw_mutex = NULL;
} else {
/* Wait till the draw mutex has started itself. */
_draw_mutex->WaitForSignal();
@@ -757,26 +758,26 @@ void VideoDriver_SDL::MainLoop()
/* The gameloop is the part that can run asynchronously. The rest
* except sleeping can't. */
- if (_draw_threaded) _draw_mutex->EndCritical();
+ if (_draw_mutex != NULL) _draw_mutex->EndCritical();
GameLoop();
- if (_draw_threaded) _draw_mutex->BeginCritical();
+ if (_draw_mutex != NULL) _draw_mutex->BeginCritical();
UpdateWindows();
_local_palette = _cur_palette;
} else {
/* Release the thread while sleeping */
- if (_draw_threaded) _draw_mutex->EndCritical();
+ if (_draw_mutex != NULL) _draw_mutex->EndCritical();
CSleep(1);
- if (_draw_threaded) _draw_mutex->BeginCritical();
+ if (_draw_mutex != NULL) _draw_mutex->BeginCritical();
NetworkDrawChatMessage();
DrawMouseCursor();
}
/* End of the critical part. */
- if (_draw_threaded && !HasModalProgress()) {
+ if (_draw_mutex != NULL && !HasModalProgress()) {
_draw_mutex->SendSignal();
} else {
/* 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;
/* Sending signal if there is no thread blocked
* is very valid and results in noop */
@@ -795,14 +796,17 @@ void VideoDriver_SDL::MainLoop()
delete _draw_mutex;
delete _draw_thread;
+
+ _draw_mutex = NULL;
+ _draw_thread = NULL;
}
}
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);
- if (_draw_threaded) _draw_mutex->EndCritical();
+ if (_draw_mutex != NULL) _draw_mutex->EndCritical();
return ret;
}