From 72a8296eb91890b6010fffbb4f16bd8e6bf9fe20 Mon Sep 17 00:00:00 2001 From: Ilari Liusvaara Date: Wed, 7 Mar 2012 14:44:24 +0200 Subject: [PATCH] Lock palettes to protect color array structure --- include/lua/bitmap.hpp | 4 ++++ src/lua/gui-bitmap.cpp | 20 +++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/lua/bitmap.hpp b/include/lua/bitmap.hpp index 4ae965ba..9b2341e7 100644 --- a/include/lua/bitmap.hpp +++ b/include/lua/bitmap.hpp @@ -5,6 +5,7 @@ #include #include #include "core/render.hpp" +#include "core/window.hpp" struct lua_bitmap { @@ -25,6 +26,9 @@ struct lua_dbitmap struct lua_palette { std::vector colors; + lua_palette(); + ~lua_palette(); + mutex* palette_mutex; }; struct lua_loaded_bitmap diff --git a/src/lua/gui-bitmap.cpp b/src/lua/gui-bitmap.cpp index b501b401..08ca2114 100644 --- a/src/lua/gui-bitmap.cpp +++ b/src/lua/gui-bitmap.cpp @@ -18,6 +18,16 @@ lua_dbitmap::lua_dbitmap(uint32_t w, uint32_t h) pixels.resize(width * height); } +lua_palette::lua_palette() +{ + palette_mutex = &mutex::aquire(); +} + +lua_palette::~lua_palette() +{ + delete palette_mutex; +} + namespace { struct render_object_bitmap : public render_object @@ -50,6 +60,8 @@ namespace void operator()(struct screen& scr) throw() { + if(p) + p->object()->palette_mutex->lock(); size_t pallim = 0; size_t w, h; premultiplied_color* palette; @@ -86,6 +98,8 @@ namespace for(int32_t c = xmin; c < xmax; c++, eptr++) b2->object()->pixels[r * b2->object()->width + c].apply(rptr[eptr]); } + if(p) + p->object()->palette_mutex->unlock(); } private: int32_t x; @@ -147,8 +161,12 @@ namespace uint16_t c = get_numeric_argument(LS, 2, fname.c_str()); int64_t nval = get_numeric_argument(LS, 3, fname.c_str()); premultiplied_color nc(nval); - if(p->colors.size() <= c); + //The mutex lock protects only the internals of colors array. + if(p->colors.size() <= c) { + p->palette_mutex->lock(); p->colors.resize(static_cast(c) + 1); + p->palette_mutex->unlock(); + } p->colors[c] = nc; return 0; });