Refine null checks and logging in WebSocket server message handling

- Introduce a local copy of user data before locking the mutex to ensure validity during message queuing.
- Enhance null checks and logging to provide clearer insights when user data or message queue access fails.
- Implement exception handling for message queue access to improve stability and error visibility.
This commit is contained in:
Torsten Schulz (local)
2025-11-20 17:47:20 +01:00
committed by Torsten (PC)
parent 3a6d60e9a8
commit 5ce1cc4e6a

View File

@@ -385,17 +385,34 @@ int WebSocketServer::wsCallback(struct lws *wsi,
break; break;
} }
std::lock_guard<std::mutex> lock(ud->messageQueueMutex); // Speichere ud-Pointer vor dem Locken, um sicherzustellen, dass er gültig bleibt
std::cout << "Mutex gelockt, füge Nachricht zur Queue hinzu..." << std::endl; WebSocketUserData* udCopy = ud;
if (!udCopy) {
// Prüfe ob ud noch gültig ist, nachdem wir den Mutex gelockt haben std::cerr << "[RECEIVE] udCopy ist nullptr" << std::endl;
if (!ud) {
std::cerr << "[RECEIVE] ud ist nullptr nach Mutex-Lock" << std::endl;
break; break;
} }
ud->messageQueue.push(messageToQueue); std::lock_guard<std::mutex> lock(udCopy->messageQueueMutex);
std::cout << "ud->messageQueue.size(): " << ud->messageQueue.size() << std::endl; std::cout << "Mutex gelockt, füge Nachricht zur Queue hinzu..." << std::endl;
// Prüfe ob udCopy noch gültig ist, nachdem wir den Mutex gelockt haben
if (!udCopy) {
std::cerr << "[RECEIVE] udCopy ist nullptr nach Mutex-Lock" << std::endl;
break;
}
// Test-Zugriff auf messageQueue, um zu prüfen ob sie gültig ist
try {
volatile size_t testSize = udCopy->messageQueue.size();
(void)testSize;
std::cout << "messageQueue ist gültig, aktuelle Größe: " << udCopy->messageQueue.size() << std::endl;
} catch (...) {
std::cerr << "[RECEIVE] messageQueue ist ungültig (Exception beim Zugriff)" << std::endl;
break;
}
udCopy->messageQueue.push(messageToQueue);
std::cout << "ud->messageQueue.size(): " << udCopy->messageQueue.size() << std::endl;
} catch (const std::exception &e) { } catch (const std::exception &e) {
std::cerr << "[RECEIVE] Fehler beim Zugriff auf messageQueue: " << e.what() << std::endl; std::cerr << "[RECEIVE] Fehler beim Zugriff auf messageQueue: " << e.what() << std::endl;
break; break;