Add a mutex for accessing the GameList

This commit is contained in:
Maschell 2020-02-20 15:19:25 +01:00
parent 25a0aa54e7
commit 340baed8ed
3 changed files with 68 additions and 19 deletions

View File

@ -16,6 +16,7 @@
#include "system/CMutex.h" #include "system/CMutex.h"
void GameList::clear() { void GameList::clear() {
lock();
for (auto const& x : fullGameList) { for (auto const& x : fullGameList) {
if(x != NULL) { if(x != NULL) {
if(x->imageData != NULL) { if(x->imageData != NULL) {
@ -31,6 +32,8 @@ void GameList::clear() {
//! Clear memory of the vector completely //! Clear memory of the vector completely
std::vector<gameInfo *>().swap(filteredList); std::vector<gameInfo *>().swap(filteredList);
std::vector<gameInfo*>().swap(fullGameList); std::vector<gameInfo*>().swap(fullGameList);
unlock();
titleListChanged(this); titleListChanged(this);
} }
@ -90,6 +93,7 @@ int32_t GameList::readGameList() {
newGameInfo->name = "<unknown>"; newGameInfo->name = "<unknown>";
newGameInfo->imageData = NULL; newGameInfo->imageData = NULL;
DCFlushRange(newGameInfo, sizeof(gameInfo)); DCFlushRange(newGameInfo, sizeof(gameInfo));
fullGameList.push_back(newGameInfo); fullGameList.push_back(newGameInfo);
titleAdded(newGameInfo); titleAdded(newGameInfo);
cnt++; cnt++;
@ -184,6 +188,7 @@ void GameList::internalFilterList(std::vector<gameInfo*> &fullList) {
} }
int32_t GameList::filterList(const char * filter) { int32_t GameList::filterList(const char * filter) {
lock();
if(filter) { if(filter) {
gameFilter = filter; gameFilter = filter;
} }
@ -202,8 +207,9 @@ int32_t GameList::filterList(const char * filter) {
titleListChanged(this); titleListChanged(this);
AsyncExecutor::execute([&] { updateTitleInfo();}); AsyncExecutor::execute([&] { updateTitleInfo();});
int32_t res = filteredList.size();
return filteredList.size(); unlock();
return res;
} }
void GameList::internalLoadUnfiltered(std::vector<gameInfo*> & fullList) { void GameList::internalLoadUnfiltered(std::vector<gameInfo*> & fullList) {
@ -215,6 +221,7 @@ void GameList::internalLoadUnfiltered(std::vector<gameInfo*> & fullList) {
} }
int32_t GameList::loadUnfiltered() { int32_t GameList::loadUnfiltered() {
lock();
if(fullGameList.size() == 0) { if(fullGameList.size() == 0) {
readGameList(); readGameList();
} }
@ -231,11 +238,15 @@ int32_t GameList::loadUnfiltered() {
titleListChanged(this); titleListChanged(this);
return filteredList.size(); int res = filteredList.size();
unlock();
return res;
} }
void GameList::sortList() { void GameList::sortList() {
lock();
std::sort(filteredList.begin(), filteredList.end(), nameSortCallback); std::sort(filteredList.begin(), filteredList.end(), nameSortCallback);
unlock();
} }
bool GameList::nameSortCallback(const gameInfo *a, const gameInfo *b) { bool GameList::nameSortCallback(const gameInfo *a, const gameInfo *b) {

View File

@ -17,24 +17,36 @@ typedef struct _gameInfo {
class GameList { class GameList {
public: public:
GameList() : selectedGame(0) { }; GameList() : selectedGame(0) { };
~GameList() { clear(); }; ~GameList() {
clear();
};
int32_t size() const { int32_t size() {
return filteredList.size(); lock();
int32_t res = filteredList.size();
unlock();
return res;
} }
int32_t gameCount() const { int32_t gameCount() {
return fullGameList.size(); lock();
int32_t res = fullGameList.size();
unlock();
return res;
} }
int32_t filterList(const char * gameFilter = NULL); int32_t filterList(const char * gameFilter = NULL);
int32_t loadUnfiltered(); int32_t loadUnfiltered();
gameInfo * at(int32_t i) const { gameInfo * at(int32_t i) {
return operator[](i); return operator[](i);
} }
gameInfo * operator[](int32_t i) const { gameInfo * operator[](int32_t i) {
lock();
gameInfo * res = NULL;
if (i < 0 || i >= (int32_t) filteredList.size()) if (i < 0 || i >= (int32_t) filteredList.size())
return NULL; res = NULL;
return filteredList[i]; res = filteredList[i];
unlock();
return res;
} }
gameInfo * getGameInfo(uint64_t titleId) const; gameInfo * getGameInfo(uint64_t titleId) const;
@ -43,22 +55,37 @@ public:
} }
void sortList(); void sortList();
void clear(); void clear();
bool operator!() const { bool operator!() {
return (fullGameList.size() == 0); lock();
bool res = (fullGameList.size() == 0);
unlock();
return res;
} }
//! Gamelist scrolling operators //! Gamelist scrolling operators
int32_t operator+=(int32_t i) { int32_t operator+=(int32_t i) {
return (selectedGame = (selectedGame+i) % filteredList.size()); lock();
int32_t res = (selectedGame = (selectedGame+i) % filteredList.size());
unlock();
return res;
} }
int32_t operator-=(int32_t i) { int32_t operator-=(int32_t i) {
return (selectedGame = (selectedGame-i+filteredList.size()) % filteredList.size()); lock();
int32_t res = (selectedGame = (selectedGame-i+filteredList.size()) % filteredList.size());
unlock();
return res;
} }
int32_t operator++() { int32_t operator++() {
return (selectedGame = (selectedGame+1) % filteredList.size()); lock();
int32_t res = (selectedGame = (selectedGame+1) % filteredList.size());
unlock();
return res;
} }
int32_t operator--() { int32_t operator--() {
return (selectedGame = (selectedGame-1+filteredList.size()) % filteredList.size()); lock();
int32_t res = (selectedGame = (selectedGame-1+filteredList.size()) % filteredList.size());
unlock();
return res;
} }
int32_t operator++(int32_t i) { int32_t operator++(int32_t i) {
return operator++(); return operator++();
@ -66,7 +93,7 @@ public:
int32_t operator--(int32_t i) { int32_t operator--(int32_t i) {
return operator--(); return operator--();
} }
gameInfo * GetCurrentSelected() const { gameInfo * GetCurrentSelected() {
return operator[](selectedGame); return operator[](selectedGame);
} }
@ -80,6 +107,13 @@ public:
sigslot::signal1<GameList *> titleListChanged; sigslot::signal1<GameList *> titleListChanged;
sigslot::signal1<gameInfo *> titleUpdated; sigslot::signal1<gameInfo *> titleUpdated;
sigslot::signal1<gameInfo *> titleAdded; sigslot::signal1<gameInfo *> titleAdded;
void lock() {
_lock.lock();
}
void unlock(){
_lock.unlock();
}
protected: protected:
int32_t readGameList(); int32_t readGameList();
@ -97,6 +131,8 @@ protected:
int32_t selectedGame; int32_t selectedGame;
std::vector<gameInfo *> filteredList; std::vector<gameInfo *> filteredList;
std::vector<gameInfo *> fullGameList; std::vector<gameInfo *> fullGameList;
CMutex _lock;
}; };
#endif #endif

View File

@ -74,6 +74,7 @@ uint64_t GuiIconGrid::getSelectedGame(void) {
void GuiIconGrid::OnGameTitleListUpdated(GameList * gameList) { void GuiIconGrid::OnGameTitleListUpdated(GameList * gameList) {
containerMutex.lock(); containerMutex.lock();
gameList->lock();
for(int32_t i = 0; i < gameList->size(); i++) { for(int32_t i = 0; i < gameList->size(); i++) {
gameInfo * info = gameList->at(i); gameInfo * info = gameList->at(i);
GameInfoContainer * container = NULL; GameInfoContainer * container = NULL;
@ -89,6 +90,7 @@ void GuiIconGrid::OnGameTitleListUpdated(GameList * gameList) {
OnGameTitleAdded(info); OnGameTitleAdded(info);
} }
} }
gameList->unlock();
containerMutex.unlock(); containerMutex.unlock();
bUpdatePositions = true; bUpdatePositions = true;
} }