Partially fix thread safety issues around _cur_palette

Replaces: 4c59dfb6
See also: https://github.com/OpenTTD/OpenTTD/issues/8712
pull/238/head
Jonathan G Rennison 3 years ago
parent b496a0c442
commit e094b7f1d6

@ -53,6 +53,7 @@ GameMode _game_mode;
SwitchMode _switch_mode; ///< The next mainloop command. SwitchMode _switch_mode; ///< The next mainloop command.
PauseMode _pause_mode; PauseMode _pause_mode;
Palette _cur_palette; Palette _cur_palette;
std::mutex _cur_palette_mutex;
std::string _switch_baseset; std::string _switch_baseset;
static byte _stringwidth_table[FS_END][224]; ///< Cache containing width of often used characters. @see GetCharacterWidth() static byte _stringwidth_table[FS_END][224]; ///< Cache containing width of often used characters. @see GetCharacterWidth()
@ -1162,6 +1163,7 @@ void DoPaletteAnimations();
void GfxInitPalettes() void GfxInitPalettes()
{ {
std::lock_guard<std::mutex> lock_state(_cur_palette_mutex);
memcpy(&_cur_palette, &_palette, sizeof(_cur_palette)); memcpy(&_cur_palette, &_palette, sizeof(_cur_palette));
DoPaletteAnimations(); DoPaletteAnimations();
} }

@ -82,6 +82,11 @@
#include "linkgraph/linkgraphschedule.h" #include "linkgraph/linkgraphschedule.h"
#include "tracerestrict.h" #include "tracerestrict.h"
#include <mutex>
#if defined(__MINGW32__)
#include "../3rdparty/mingw-std-threads/mingw.mutex.h"
#endif
#include <stdarg.h> #include <stdarg.h>
#include <system_error> #include <system_error>
@ -1971,7 +1976,11 @@ void GameLoop()
StateGameLoop(); StateGameLoop();
} }
if (!_pause_mode && HasBit(_display_opt, DO_FULL_ANIMATION)) DoPaletteAnimations(); if (!_pause_mode && HasBit(_display_opt, DO_FULL_ANIMATION)) {
extern std::mutex _cur_palette_mutex;
std::lock_guard<std::mutex> lock_state(_cur_palette_mutex);
DoPaletteAnimations();
}
SoundDriver::GetInstance()->MainLoop(); SoundDriver::GetInstance()->MainLoop();
MusicLoop(); MusicLoop();

@ -174,7 +174,12 @@ void VideoDriver::Tick()
this->PopulateSystemSprites(); this->PopulateSystemSprites();
} }
this->CheckPaletteAnim(); {
extern std::mutex _cur_palette_mutex;
std::lock_guard<std::mutex> lock_state(_cur_palette_mutex);
this->CheckPaletteAnim();
}
this->Paint(); this->Paint();
this->UnlockVideoBuffer(); this->UnlockVideoBuffer();

Loading…
Cancel
Save