Browse Source

Fixes freeze when debugging failed to start: Dispatcher::post can now be performed within another Dispatcher::post, no longer leading to deadlock

merge-requests/365/head
eidheim 8 years ago
parent
commit
048cb16612
  1. 19
      src/dispatcher.cc

19
src/dispatcher.cc

@ -1,18 +1,27 @@
#include "dispatcher.h" #include "dispatcher.h"
#include <vector>
Dispatcher::Dispatcher() { Dispatcher::Dispatcher() {
connection=dispatcher.connect([this] { connection=dispatcher.connect([this] {
std::vector<std::list<std::function<void()>>::iterator> its;
{
std::unique_lock<std::mutex> lock(functions_mutex); std::unique_lock<std::mutex> lock(functions_mutex);
for(auto &function: functions) its.reserve(functions.size());
function(); for(auto it=functions.begin();it!=functions.end();++it)
functions.clear(); its.emplace_back(it);
}
for(auto &it: its)
(*it)();
{
std::unique_lock<std::mutex> lock(functions_mutex);
for(auto &it: its)
functions.erase(it);
}
}); });
} }
Dispatcher::~Dispatcher() { Dispatcher::~Dispatcher() {
disconnect(); disconnect();
std::unique_lock<std::mutex> lock(functions_mutex);
functions.clear();
} }
void Dispatcher::disconnect() { void Dispatcher::disconnect() {

Loading…
Cancel
Save