From 5430625a7e2ed36e26bb29004b6009c552a659f9 Mon Sep 17 00:00:00 2001 From: sithlord48 Date: Tue, 10 Jun 2025 22:32:03 -0400 Subject: [PATCH] refactor: handle read and write on tcpsocket at the same time port https://github.com/debauchee/barrier/pull/211/commits/94f8336af546c724f4be21f41df766284899247a --- src/lib/net/TCPSocket.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/lib/net/TCPSocket.cpp b/src/lib/net/TCPSocket.cpp index 918555570..86b4884f6 100644 --- a/src/lib/net/TCPSocket.cpp +++ b/src/lib/net/TCPSocket.cpp @@ -494,10 +494,11 @@ ISocketMultiplexerJob *TCPSocket::serviceConnected(ISocketMultiplexerJob *job, b return newJob(); } - EJobResult result = kRetry; + EJobResult readResult = kRetry; + EJobResult writeResult = kRetry; if (write) { try { - result = doWrite(); + writeResult = doWrite(); } catch (XArchNetworkShutdown &) { // remote read end of stream hungup. our output side // has therefore shutdown. @@ -507,39 +508,41 @@ ISocketMultiplexerJob *TCPSocket::serviceConnected(ISocketMultiplexerJob *job, b sendEvent(EventTypes::SocketDisconnected); m_connected = false; } - result = kNew; + writeResult = kNew; } catch (XArchNetworkDisconnected &) { // stream hungup onDisconnected(); sendEvent(EventTypes::SocketDisconnected); - result = kNew; + writeResult = kNew; } catch (XArchNetwork &e) { // other write error LOG((CLOG_WARN "error writing socket: %s", e.what())); onDisconnected(); sendEvent(EventTypes::StreamOutputError); sendEvent(EventTypes::SocketDisconnected); - result = kNew; + writeResult = kNew; } } if (read && m_readable) { try { - result = doRead(); + readResult = doRead(); } catch (XArchNetworkDisconnected &) { // stream hungup sendEvent(EventTypes::SocketDisconnected); onDisconnected(); - result = kNew; + readResult = kNew; } catch (XArchNetwork &e) { // ignore other read error LOG((CLOG_WARN "error reading socket: %s", e.what())); } } - if (result == kBreak) { + if (readResult == kBreak || writeResult == kBreak) return nullptr; - } - return result == kNew ? newJob() : job; + if (writeResult == kNew || readResult == kNew) + return newJob(); + + return job; }