Corrected multithreading issue

This commit is contained in:
emeric
2018-06-26 13:28:24 +02:00
parent c427396623
commit ff96775a03
5 changed files with 28 additions and 10 deletions
+1 -1
View File
@@ -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
+3 -3
View File
@@ -50,7 +50,7 @@
namespace UserInterface {
std::unique_ptr<Wt::WApplication>
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
+3 -3
View File
@@ -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<Wt::WApplication> 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;
+9
View File
@@ -37,6 +37,7 @@ LmsApplicationInfo::fromEnvironment(const Wt::WEnvironment& env)
void
LmsApplicationGroup::join(LmsApplicationInfo info)
{
std::lock_guard<std::mutex> lock(_mutex);
_apps.emplace(wApp->sessionId(), std::move(info));
}
@@ -52,6 +53,7 @@ LmsApplicationGroup::getOtherSessionIds() const
{
std::vector<std::string> res;
std::lock_guard<std::mutex> lock(_mutex);
for (auto const& app : _apps)
{
if (app.first != wApp->sessionId())
@@ -74,5 +76,12 @@ LmsApplicationGroup::postOthers(std::function<void()> func) const
}
}
LmsApplicationGroup&
LmsApplicationGroupContainer::get(Wt::WString identity)
{
std::lock_guard<std::mutex> lock(_mutex);
return _apps[identity];
}
} // UserInterface
+12 -3
View File
@@ -20,6 +20,7 @@
#pragma once
#include <map>
#include <mutex>
#include <Wt/WSignal.h>
#include <Wt/WEnvironment.h>
@@ -41,17 +42,25 @@ class LmsApplicationGroup
void join(LmsApplicationInfo info);
void leave();
std::vector<LmsApplicationInfo> list() const;
void postOthers(std::function<void()> func) const;
private:
mutable std::mutex _mutex;
std::vector<std::string> getOtherSessionIds() const;
std::map<std::string, LmsApplicationInfo> _apps;
};
using LmsApplicationGroups = std::map<Wt::WString, LmsApplicationGroup>;
class LmsApplicationGroupContainer
{
public:
LmsApplicationGroup& get(Wt::WString identity);
private:
std::map<Wt::WString, LmsApplicationGroup> _apps;
std::mutex _mutex;
};
} // UserInterface