From e8ee63068bfc2524f75ef3f5cf72edfeeb0560af Mon Sep 17 00:00:00 2001 From: Maschell Date: Thu, 13 Aug 2020 13:27:32 +0200 Subject: [PATCH] Use a mutex to lock access to internal ist --- include/gui/GuiFrame.h | 2 ++ source/gui/GuiFrame.cpp | 28 +++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/include/gui/GuiFrame.h b/include/gui/GuiFrame.h index 362ccd1..7a00ba0 100644 --- a/include/gui/GuiFrame.h +++ b/include/gui/GuiFrame.h @@ -18,6 +18,7 @@ #define GUI_FRAME_H_ #include +#include #include #include @@ -119,6 +120,7 @@ protected: bool dim; //! Enable/disable dim of a window only GuiFrame *parent; //!< Parent Window std::vector elements; //!< Contains all elements within the GuiFrame + std::recursive_mutex mutex; }; #endif diff --git a/source/gui/GuiFrame.cpp b/source/gui/GuiFrame.cpp index c923fda..5d561cf 100644 --- a/source/gui/GuiFrame.cpp +++ b/source/gui/GuiFrame.cpp @@ -52,8 +52,10 @@ void GuiFrame::append(GuiElement *e) { } remove(e); + mutex.lock(); elements.push_back(e); e->setParent(this); + mutex.unlock(); } void GuiFrame::insert(GuiElement *e, uint32_t index) { @@ -62,8 +64,10 @@ void GuiFrame::insert(GuiElement *e, uint32_t index) { } remove(e); + mutex.lock(); elements.insert(elements.begin() + index, e); e->setParent(this); + mutex.unlock(); } void GuiFrame::remove(GuiElement *e) { @@ -71,16 +75,20 @@ void GuiFrame::remove(GuiElement *e) { return; } + mutex.lock(); for (uint32_t i = 0; i < elements.size(); ++i) { if (e == elements[i]) { elements.erase(elements.begin() + i); break; } } + mutex.unlock(); } void GuiFrame::removeAll() { + mutex.lock(); elements.clear(); + mutex.unlock(); } void GuiFrame::close() { @@ -95,6 +103,7 @@ GuiElement *GuiFrame::getGuiElementAt(uint32_t index) const { if (index >= elements.size()) { return NULL; } + return elements[index]; } @@ -105,44 +114,53 @@ uint32_t GuiFrame::getSize() { void GuiFrame::resetState() { GuiElement::resetState(); + mutex.lock(); for (uint32_t i = 0; i < elements.size(); ++i) { elements[i]->resetState(); } + mutex.unlock(); } void GuiFrame::setState(int32_t s, int32_t c) { GuiElement::setState(s, c); - + mutex.lock(); for (uint32_t i = 0; i < elements.size(); ++i) { elements[i]->setState(s, c); } + mutex.unlock(); } void GuiFrame::clearState(int32_t s, int32_t c) { GuiElement::clearState(s, c); + mutex.lock(); for (uint32_t i = 0; i < elements.size(); ++i) { elements[i]->clearState(s, c); } + mutex.unlock(); } void GuiFrame::setVisible(bool v) { visible = v; + mutex.lock(); for (uint32_t i = 0; i < elements.size(); ++i) { elements[i]->setVisible(v); } + mutex.unlock(); } int32_t GuiFrame::getSelected() { // find selected element int32_t found = -1; + mutex.lock(); for (uint32_t i = 0; i < elements.size(); ++i) { if (elements[i]->isStateSet(STATE_SELECTED | STATE_OVER)) { found = i; break; } } + mutex.unlock(); return found; } @@ -156,12 +174,14 @@ void GuiFrame::draw(CVideo *v) { //Menu_DrawRectangle(0, 0, GetZPosition(), screenwidth,screenheight, &dimColor, false, true); } + mutex.lock(); //! render appended items next frame but allow stop of render if size is reached uint32_t size = elements.size(); for (uint32_t i = 0; i < size && i < elements.size(); ++i) { elements[i]->draw(v); } + mutex.unlock(); } void GuiFrame::updateEffects() { @@ -171,12 +191,14 @@ void GuiFrame::updateEffects() { GuiElement::updateEffects(); + mutex.lock(); //! render appended items next frame but allow stop of render if size is reached uint32_t size = elements.size(); for (uint32_t i = 0; i < size && i < elements.size(); ++i) { elements[i]->updateEffects(); } + mutex.unlock(); } void GuiFrame::process() { @@ -186,12 +208,14 @@ void GuiFrame::process() { GuiElement::process(); + mutex.lock(); //! render appended items next frame but allow stop of render if size is reached uint32_t size = elements.size(); for (uint32_t i = 0; i < size && i < elements.size(); ++i) { elements[i]->process(); } + mutex.unlock(); } void GuiFrame::update(GuiController *c) { @@ -199,10 +223,12 @@ void GuiFrame::update(GuiController *c) { return; } + mutex.lock(); //! update appended items next frame uint32_t size = elements.size(); for (uint32_t i = 0; i < size && i < elements.size(); ++i) { elements[i]->update(c); } + mutex.unlock(); }