[Scummvm-git-logs] scummvm master -> abd2a3d630805e1fbb62d0583b0e7fb13b127d3e

AndywinXp noreply at scummvm.org
Sat Sep 30 17:54:20 UTC 2023


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
abd2a3d630 SWORD1: Protect concurrent menu bar elements accesses


Commit: abd2a3d630805e1fbb62d0583b0e7fb13b127d3e
    https://github.com/scummvm/scummvm/commit/abd2a3d630805e1fbb62d0583b0e7fb13b127d3e
Author: AndywinXp (andywinxp at gmail.com)
Date: 2023-09-30T19:54:13+02:00

Commit Message:
SWORD1: Protect concurrent menu bar elements accesses

Still part of #14638. I have began measuring for slowdowns
caused by mutexes, on slow Virtual Machines, and luckily I
have found none for now...

Changed paths:
    engines/sword1/menu.cpp
    engines/sword1/menu.h


diff --git a/engines/sword1/menu.cpp b/engines/sword1/menu.cpp
index fc42657c0a3..2d2604bc0d3 100644
--- a/engines/sword1/menu.cpp
+++ b/engines/sword1/menu.cpp
@@ -138,6 +138,7 @@ void Menu::refreshMenus() {
 }
 
 uint8 Menu::checkMenuClick(uint8 menuType) {
+	Common::StackLock lock(_menuMutex);
 	uint16 mouseEvent = _mouse->testEvent();
 	if (!mouseEvent)
 		return 0;
@@ -211,6 +212,7 @@ uint8 Menu::checkMenuClick(uint8 menuType) {
 }
 
 void Menu::buildSubjects() {
+	Common::StackLock lock(_menuMutex);
 	uint8 cnt;
 	for (cnt = 0; cnt < 16; cnt++)
 		if (_subjects[cnt]) {
@@ -229,6 +231,7 @@ void Menu::buildSubjects() {
 }
 
 void Menu::refresh(uint8 menuType) {
+	Common::StackLock lock(_menuMutex);
 	uint i;
 
 	if (menuType == MENU_TOP) {
@@ -285,6 +288,7 @@ void Menu::refresh(uint8 menuType) {
 }
 
 void Menu::buildMenu() {
+	Common::StackLock lock(_menuMutex);
 	uint32 *pockets = Logic::_scriptVars + POCKET_1;
 	for (uint8 cnt = 0; cnt < _inMenu; cnt++)
 		if (_objects[cnt]) {
@@ -316,6 +320,7 @@ void Menu::buildMenu() {
 }
 
 void Menu::showMenu(uint8 menuType) {
+	Common::StackLock lock(_menuMutex);
 	if (menuType == MENU_TOP) {
 		if (_objectBarStatus == MENU_OPEN) {
 			for (uint8 cnt = 0; cnt < 16; cnt++) {
@@ -341,6 +346,7 @@ void Menu::fnStartMenu() {
 }
 
 void Menu::fnEndMenu() {
+	Common::StackLock lock(_menuMutex);
 	if (_objectBarStatus != MENU_CLOSED)
 		_objectBarStatus = MENU_CLOSING;
 }
@@ -351,23 +357,31 @@ void Menu::fnChooser(Object *compact) {
 	buildSubjects();
 	compact->o_logic = LOGIC_choose;
 	_mouse->controlPanel(true); // so the mouse cursor will be shown.
+
+	Common::StackLock lock(_menuMutex);
 	_subjectBarStatus = MENU_OPENING;
 }
 
 void Menu::fnEndChooser() {
 	Logic::_scriptVars[OBJECT_HELD] = 0;
+
+	_menuMutex.lock();
 	_subjectBarStatus = MENU_CLOSING;
 	_objectBarStatus = MENU_CLOSING;
+	_menuMutex.unlock();
+
 	_mouse->controlPanel(false);
 	_mouse->setLuggage(0, 0);
 }
 
 void Menu::checkTopMenu() {
+	Common::StackLock lock(_menuMutex);
 	if (_objectBarStatus == MENU_OPEN)
 		checkMenuClick(MENU_TOP);
 }
 
 void Menu::setToTargetState() {
+	Common::StackLock lock(_menuMutex);
 	// This is an optimization for all the locks introduced
 	// with the fade palette changes: we disable the menu
 	// updates whenever the palette is fading, and we bring
@@ -386,6 +400,7 @@ void Menu::setToTargetState() {
 }
 
 int Menu::logicChooser(Object *compact) {
+	Common::StackLock lock(_menuMutex);
 	uint8 objSelected = 0;
 	if (_objectBarStatus == MENU_OPEN)
 		objSelected = checkMenuClick(MENU_TOP);
@@ -399,11 +414,13 @@ int Menu::logicChooser(Object *compact) {
 }
 
 void Menu::fnAddSubject(int32 sub) {
+	Common::StackLock lock(_menuMutex);
 	_subjectBar[Logic::_scriptVars[IN_SUBJECT]] = sub;
 	Logic::_scriptVars[IN_SUBJECT]++;
 }
 
 void Menu::cfnReleaseMenu() {
+	Common::StackLock lock(_menuMutex);
 	_objectBarStatus = MENU_CLOSING;
 }
 
diff --git a/engines/sword1/menu.h b/engines/sword1/menu.h
index eb8ff50a7ad..be0a8390d7a 100644
--- a/engines/sword1/menu.h
+++ b/engines/sword1/menu.h
@@ -24,6 +24,7 @@
 
 #include "sword1/sworddefs.h"
 #include "sword1/object.h"
+#include "common/mutex.h"
 
 namespace Sword1 {
 
@@ -102,6 +103,8 @@ private:
 
 	static const byte _fadeEffectTop[64];
 	static const byte _fadeEffectBottom[64];
+
+	Common::Mutex _menuMutex;
 };
 
 } // End of namespace Sword1




More information about the Scummvm-git-logs mailing list