Skip to content

Commit 906be78

Browse files
Added catch to messaging loop, should give better message and stay alive
1 parent 7cee8f9 commit 906be78

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

VCellMessaging/include/VCELL/MessageEventManager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class MessageEventManager {
4242
bool stopWasCalled();
4343

4444
private:
45+
void performQueueProcessing();
4546
void processQueue();
4647
void processEvent(WorkerEvent* event);
4748
void enqueue(WorkerEvent*);

VCellMessaging/src/MessageEventManager.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
#include <VCELL/MessageEventManager.h>
55
#include <iostream>
66
#include <utility>
7+
#include <format>
8+
#include <exception>
9+
#include <system_error>
710

811
MessageEventManager::MessageEventManager(std::function<void(WorkerEvent*)> sendUpdateFunction):
912
stopRequested{false},
1013
sendUpdateFunction{std::move(sendUpdateFunction)},
11-
eventQueueProcessingWorkerThread([this]() {this->processQueue();}) // Should auto-start thread
14+
eventQueueProcessingWorkerThread([this]() {this->performQueueProcessing();}) // Should auto-start thread
1215
{
1316

1417
}
@@ -32,6 +35,7 @@ void MessageEventManager::enqueue(const JobEvent::Status status, const char *eve
3235

3336
void MessageEventManager::requestStopAndWaitForIt() {
3437
std::unique_lock stopRequestedLock{this->stopRequestedMutex};
38+
if (this->stopRequested) return;
3539
this->stopRequested = true;
3640
this->needMessageProcessingForeman.notify_all();
3741
this->requestedStopForeman.wait(stopRequestedLock, [this]()->bool{return this->eventQueue.empty();});
@@ -47,6 +51,18 @@ bool MessageEventManager::stopWasCalled() {
4751
/// Private Methods ///
4852
///////////////////////////////////////////////////
4953

54+
void MessageEventManager::performQueueProcessing() {
55+
try {
56+
processQueue();
57+
} catch (std::system_error e) {
58+
std::cerr << std::format("System Error (Code {} - {}): {}", std::to_string(e.code().value()), e.code().category().name(), e.what()) << std::endl;
59+
} catch (std::exception& e) {
60+
std::cerr << e.what() << std::endl;
61+
} catch (...) {
62+
std::cerr << "An unknown exception occurred while processing the event queue!" << std::endl;
63+
}
64+
}
65+
5066
void MessageEventManager::processQueue() {
5167
while (true) {
5268
WorkerEvent* event;

0 commit comments

Comments
 (0)