diff --git a/src/app.cpp b/src/app.cpp index 4b93be7..abcfb06 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -844,7 +844,7 @@ void App::addLeaveButton() { } void App::logout() { - server_.disconnect(this); + server_.addToDisconnectList(this); userListContainer_->clear(); menuContainer_->clear(); userName = ""; @@ -1116,7 +1116,6 @@ void App::showPartnerSites() { for (size_t i = 0; i < doc.GetRowCount(); ++i) { auto url = doc.GetCell(1, i); auto name = doc.GetCell(0, i); - std::cout << url << std::endl; auto link = Wt::WLink(url); link.setTarget(Wt::LinkTarget::NewWindow); contentLayout->addNew(link, name); diff --git a/src/broadcast.cpp b/src/broadcast.cpp index 4ed7eea..ba80fd7 100644 --- a/src/broadcast.cpp +++ b/src/broadcast.cpp @@ -42,6 +42,7 @@ void Broadcast::disconnect(Client *client) { for (unsigned int i = 0; i < connections_.size(); ++ i) { if (connections_[i]->client() == client) { connections_.erase(connections_.begin() + i); + break; } } Wt::Json::Object leftBroadcast{ @@ -63,6 +64,10 @@ void Broadcast::disconnect(Client *client) { } } +void Broadcast::addToDisconnectList(Client *client) { + toDisconnect_.push_back(client); +} + Wt::Json::Object Broadcast::reSetUser(std::string oldSessionId, std::string newSessionId) { for (auto& connection : connections_) { if (connection->setSessionId(oldSessionId, newSessionId)) { @@ -145,13 +150,12 @@ void Broadcast::run() { {"type", "timedout"}, {"data", "dummy"} }; - std::vector toDisconnect; for (;;) { - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - for (auto clientToDisconnect: toDisconnect) { + std::this_thread::sleep_for(std::chrono::milliseconds(200)); + for (auto clientToDisconnect: toDisconnect_) { disconnect(clientToDisconnect); } - toDisconnect.clear(); + toDisconnect_.clear(); if (stop_) { return; } @@ -159,7 +163,7 @@ void Broadcast::run() { for (auto &connection: connections_) { if (connection->client()->activitiesTimedOut()) { auto sessionId = connection->sessionId(); - toDisconnect.push_back(connection->client()); + toDisconnect_.push_back(connection->client()); addMessageToSessionBroadcast(sessionId, timedoutBroadcast); } if (connection->getBroadcasts().size() == 0) { diff --git a/src/broadcast.h b/src/broadcast.h index c208583..3582bd7 100644 --- a/src/broadcast.h +++ b/src/broadcast.h @@ -72,6 +72,7 @@ public: ~Broadcast(); void connect(Client *client, const std::function &fct); void disconnect(Client *client); + void addToDisconnectList(Client *client); Wt::Json::Object reSetUser(std::string oldSessionId, std::string newSessionId); int count() const; std::string userNameForSessionId(std::string sessionId); @@ -132,6 +133,7 @@ private: Wt::WDateTime lastTimeoutCheck_; std::unordered_map conversations_; std::unordered_map > blockings_; + std::vector toDisconnect_; void run(); Wt::Json::Object logoutBroadcast(); static size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output);