From b7dbeccaeff7b2ca754c343d2994a01b011357b5 Mon Sep 17 00:00:00 2001 From: Paul Hollinsky Date: Thu, 13 Jun 2019 15:47:23 -0400 Subject: [PATCH] Lock before adding or removing message callbacks --- communication/communication.cpp | 5 ++++- include/icsneo/communication/communication.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/communication/communication.cpp b/communication/communication.cpp index 320a03e..c973bfb 100644 --- a/communication/communication.cpp +++ b/communication/communication.cpp @@ -91,11 +91,13 @@ std::shared_ptr Communication::getSerialNumberSync(std::chr } int Communication::addMessageCallback(const MessageCallback& cb) { + std::lock_guard lk(messageCallbacksLock); messageCallbacks.insert(std::make_pair(messageCallbackIDCounter, cb)); return messageCallbackIDCounter++; } bool Communication::removeMessageCallback(int id) { + std::lock_guard lk(messageCallbacksLock); try { messageCallbacks.erase(id); return true; @@ -140,7 +142,8 @@ void Communication::readTask() { err(APIError::Unknown); // TODO Use specific error continue; } - + + std::lock_guard lk(messageCallbacksLock); for(auto& cb : messageCallbacks) { if(!closing) { // We might have closed while reading or processing cb.second.callIfMatch(msg); diff --git a/include/icsneo/communication/communication.h b/include/icsneo/communication/communication.h index e92c873..47d0ec7 100644 --- a/include/icsneo/communication/communication.h +++ b/include/icsneo/communication/communication.h @@ -57,6 +57,7 @@ public: protected: std::unique_ptr impl; static int messageCallbackIDCounter; + std::mutex messageCallbacksLock; std::map messageCallbacks; std::atomic closing{false};