diff options
author | rubidium <rubidium@openttd.org> | 2013-02-17 20:37:18 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2013-02-17 20:37:18 +0000 |
commit | dcf3df65d3cddb043d8eed8724e7e06edd84e557 (patch) | |
tree | afce7d7dcab88018bf477b9915fc460e69245c03 /src | |
parent | bae033c23dea6d3f97f66f26e3e6f2ebc48b8d34 (diff) | |
download | openttd-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.cpp | 20 |
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; } |