From ff96775a0342d00db9118129f783b22473c86e8f Mon Sep 17 00:00:00 2001 From: emeric Date: Tue, 26 Jun 2018 13:28:24 +0200 Subject: [PATCH] Corrected multithreading issue --- src/main/main.cpp | 2 +- src/ui/LmsApplication.cpp | 6 +++--- src/ui/LmsApplication.hpp | 6 +++--- src/ui/LmsApplicationGroup.cpp | 9 +++++++++ src/ui/LmsApplicationGroup.hpp | 15 ++++++++++++--- 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 44eb8740..f047267f 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -122,7 +122,7 @@ int main(int argc, char* argv[]) // Initializing a connection pool to the database that will be shared along services auto connectionPool = Database::Handler::createConnectionPool(Config::instance().getPath("working-dir") / "lms.db"); - UserInterface::LmsApplicationGroups appGroups; + UserInterface::LmsApplicationGroupContainer appGroups; Scanner::MediaScanner scanner(*connectionPool); // bind entry point diff --git a/src/ui/LmsApplication.cpp b/src/ui/LmsApplication.cpp index 5749bb0b..237b92df 100644 --- a/src/ui/LmsApplication.cpp +++ b/src/ui/LmsApplication.cpp @@ -50,7 +50,7 @@ namespace UserInterface { std::unique_ptr -LmsApplication::create(const Wt::WEnvironment& env, Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroups& appGroups, Scanner::MediaScanner& scanner) +LmsApplication::create(const Wt::WEnvironment& env, Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroupContainer& appGroups, Scanner::MediaScanner& scanner) { /* * You could read information from the environment to decide whether @@ -71,7 +71,7 @@ LmsApplication::instance() * constructor so it is typically also an argument for your custom * application constructor. */ -LmsApplication::LmsApplication(const Wt::WEnvironment& env, Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroups& appGroups, Scanner::MediaScanner& scanner) +LmsApplication::LmsApplication(const Wt::WEnvironment& env, Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroupContainer& appGroups, Scanner::MediaScanner& scanner) : Wt::WApplication(env), _db(connectionPool), _appGroups(appGroups), @@ -254,7 +254,7 @@ handlePathChange(Wt::WStackedWidget* stack, bool isAdmin) LmsApplicationGroup& LmsApplication::getApplicationGroup() { - return _appGroups[_userIdentity]; + return _appGroups.get(_userIdentity); } void diff --git a/src/ui/LmsApplication.hpp b/src/ui/LmsApplication.hpp index 7733e691..4bdd04bf 100644 --- a/src/ui/LmsApplication.hpp +++ b/src/ui/LmsApplication.hpp @@ -47,11 +47,11 @@ struct GroupEvents class LmsApplication : public Wt::WApplication { public: - LmsApplication(const Wt::WEnvironment& env, Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroups& appGroups, Scanner::MediaScanner& scanner); + LmsApplication(const Wt::WEnvironment& env, Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroupContainer& appGroups, Scanner::MediaScanner& scanner); ~LmsApplication(); static std::unique_ptr create(const Wt::WEnvironment& env, - Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroups& appGroups, Scanner::MediaScanner& scanner); + Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroupContainer& appGroups, Scanner::MediaScanner& scanner); static LmsApplication* instance(); // Session application data @@ -88,7 +88,7 @@ class LmsApplication : public Wt::WApplication void createHome(); Database::Handler _db; - LmsApplicationGroups& _appGroups; + LmsApplicationGroupContainer& _appGroups; GroupEvents _groupEvents; Wt::WString _userIdentity; Auth* _auth; diff --git a/src/ui/LmsApplicationGroup.cpp b/src/ui/LmsApplicationGroup.cpp index 7e64ca65..8a742486 100644 --- a/src/ui/LmsApplicationGroup.cpp +++ b/src/ui/LmsApplicationGroup.cpp @@ -37,6 +37,7 @@ LmsApplicationInfo::fromEnvironment(const Wt::WEnvironment& env) void LmsApplicationGroup::join(LmsApplicationInfo info) { + std::lock_guard lock(_mutex); _apps.emplace(wApp->sessionId(), std::move(info)); } @@ -52,6 +53,7 @@ LmsApplicationGroup::getOtherSessionIds() const { std::vector res; + std::lock_guard lock(_mutex); for (auto const& app : _apps) { if (app.first != wApp->sessionId()) @@ -74,5 +76,12 @@ LmsApplicationGroup::postOthers(std::function func) const } } +LmsApplicationGroup& +LmsApplicationGroupContainer::get(Wt::WString identity) +{ + std::lock_guard lock(_mutex); + + return _apps[identity]; +} } // UserInterface diff --git a/src/ui/LmsApplicationGroup.hpp b/src/ui/LmsApplicationGroup.hpp index e18cc456..326fe63a 100644 --- a/src/ui/LmsApplicationGroup.hpp +++ b/src/ui/LmsApplicationGroup.hpp @@ -20,6 +20,7 @@ #pragma once #include +#include #include #include @@ -41,17 +42,25 @@ class LmsApplicationGroup void join(LmsApplicationInfo info); void leave(); - std::vector list() const; - void postOthers(std::function func) const; private: + mutable std::mutex _mutex; + std::vector getOtherSessionIds() const; std::map _apps; }; -using LmsApplicationGroups = std::map; +class LmsApplicationGroupContainer +{ + public: + LmsApplicationGroup& get(Wt::WString identity); + + private: + std::map _apps; + std::mutex _mutex; +}; } // UserInterface