| 83 | } |
| 84 | |
| 85 | List<PacketPtr> WorldServerThread::removeClient(ConnectionId clientId) { |
| 86 | RecursiveMutexLocker locker(m_mutex); |
| 87 | if (!m_clients.contains(clientId)) |
| 88 | return {}; |
| 89 | |
| 90 | RecursiveMutexLocker queueLocker(m_queueMutex); |
| 91 | |
| 92 | List<PacketPtr> outgoingPackets; |
| 93 | try { |
| 94 | auto incomingPackets = take(m_incomingPacketQueue[clientId]); |
| 95 | if (m_worldServer->hasClient(clientId)) |
| 96 | m_worldServer->handleIncomingPackets(clientId, std::move(incomingPackets)); |
| 97 | |
| 98 | outgoingPackets = take(m_outgoingPacketQueue[clientId]); |
| 99 | if (m_worldServer->hasClient(clientId)) |
| 100 | outgoingPackets.appendAll(m_worldServer->removeClient(clientId)); |
| 101 | |
| 102 | } catch (std::exception const& e) { |
| 103 | Logger::error("WorldServerThread exception caught: {}", outputException(e, true)); |
| 104 | m_errorOccurred = true; |
| 105 | } |
| 106 | |
| 107 | m_clients.remove(clientId); |
| 108 | m_incomingPacketQueue.remove(clientId); |
| 109 | m_outgoingPacketQueue.remove(clientId); |
| 110 | return outgoingPackets; |
| 111 | } |
| 112 | |
| 113 | List<ConnectionId> WorldServerThread::clients() const { |
| 114 | RecursiveMutexLocker locker(m_mutex); |
no test coverage detected