Lock before adding or removing message callbacks
parent
4530bd14c0
commit
b7dbeccaef
|
|
@ -91,11 +91,13 @@ std::shared_ptr<SerialNumberMessage> Communication::getSerialNumberSync(std::chr
|
||||||
}
|
}
|
||||||
|
|
||||||
int Communication::addMessageCallback(const MessageCallback& cb) {
|
int Communication::addMessageCallback(const MessageCallback& cb) {
|
||||||
|
std::lock_guard<std::mutex> lk(messageCallbacksLock);
|
||||||
messageCallbacks.insert(std::make_pair(messageCallbackIDCounter, cb));
|
messageCallbacks.insert(std::make_pair(messageCallbackIDCounter, cb));
|
||||||
return messageCallbackIDCounter++;
|
return messageCallbackIDCounter++;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Communication::removeMessageCallback(int id) {
|
bool Communication::removeMessageCallback(int id) {
|
||||||
|
std::lock_guard<std::mutex> lk(messageCallbacksLock);
|
||||||
try {
|
try {
|
||||||
messageCallbacks.erase(id);
|
messageCallbacks.erase(id);
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -140,7 +142,8 @@ void Communication::readTask() {
|
||||||
err(APIError::Unknown); // TODO Use specific error
|
err(APIError::Unknown); // TODO Use specific error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::lock_guard<std::mutex> lk(messageCallbacksLock);
|
||||||
for(auto& cb : messageCallbacks) {
|
for(auto& cb : messageCallbacks) {
|
||||||
if(!closing) { // We might have closed while reading or processing
|
if(!closing) { // We might have closed while reading or processing
|
||||||
cb.second.callIfMatch(msg);
|
cb.second.callIfMatch(msg);
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,7 @@ public:
|
||||||
protected:
|
protected:
|
||||||
std::unique_ptr<ICommunication> impl;
|
std::unique_ptr<ICommunication> impl;
|
||||||
static int messageCallbackIDCounter;
|
static int messageCallbackIDCounter;
|
||||||
|
std::mutex messageCallbacksLock;
|
||||||
std::map<int, MessageCallback> messageCallbacks;
|
std::map<int, MessageCallback> messageCallbacks;
|
||||||
std::atomic<bool> closing{false};
|
std::atomic<bool> closing{false};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue