From daa59b89b1f05cf3a2abdee9ef5ac8bffe805b13 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 12 Jan 2019 20:39:23 +0100 Subject: Fix multithreading crashes --- src/Window.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'src/Window.cpp') diff --git a/src/Window.cpp b/src/Window.cpp index 255986a..8a6652e 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -41,7 +41,7 @@ namespace dchat return result; } - Window::Window() : + Window::Window() : chatWindow(this) { set_border_width(0); @@ -230,12 +230,15 @@ namespace dchat dispatcher.connect([this]() { - std::lock_guard lock(dispatcherMutex); - for(DispatcherHandler &dispatcherHandler : dispatcherHandlers) + std::lock_guard lock(dispatcherMutex); + // We make a copy because dispatcherHandler below can call main loop again (for example when scrolling) which will call this function, + // and we want to prevent the same dispatcher from being called multiple times + auto handlersCopies = dispatcherHandlers; + dispatcherHandlers.clear(); + for(DispatcherHandler &dispatcherHandler : handlersCopies) { dispatcherHandler(); } - dispatcherHandlers.clear(); }); Rooms::connect(bootstrapNode->c_str(), 27130, roomCallbackFuncs); @@ -280,7 +283,7 @@ namespace dchat void Window::dispatchFunction(DispatcherHandler func) { - std::lock_guard lock(dispatcherMutex); + std::lock_guard lock(dispatcherMutex); dispatcherHandlers.push_back(func); dispatcher.emit(); } @@ -380,4 +383,4 @@ namespace dchat queue_draw(); return true; } -} \ No newline at end of file +} -- cgit v1.2.3