From f22c48fc4488076be6d85ea3c5091ffd0dc9c3bd Mon Sep 17 00:00:00 2001 From: Dave Behnke <916775+dbehnke@users.noreply.github.com> Date: Wed, 24 Dec 2025 04:03:49 -0500 Subject: [PATCH] fix(tc): prevent runaway CPU and blocking in transcoder handling --- reflector/TCSocket.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/reflector/TCSocket.cpp b/reflector/TCSocket.cpp index 93819d8..35b1d67 100644 --- a/reflector/TCSocket.cpp +++ b/reflector/TCSocket.cpp @@ -185,6 +185,7 @@ bool CTCServer::Receive(char module, STCPacket *packet, int ms) auto pfds = &m_Pfd[pos]; if (pfds->fd < 0) { + std::this_thread::sleep_for(std::chrono::milliseconds(ms)); return rv; } @@ -287,7 +288,7 @@ bool CTCServer::Accept() wmod.append(1, c); } - std::cout << "Waiting at " << m_Ip << " for transcoder connection"; + std::cout << "Checking " << m_Ip << " for transcoder connection"; if (wmod.size() > 1) { std::cout << "s for modules "; @@ -298,8 +299,23 @@ bool CTCServer::Accept() } std::cout << wmod << "..." << std::endl; + struct pollfd pfd; + pfd.fd = fd; + pfd.events = POLLIN; + while (AnyAreClosed()) { + auto p = poll(&pfd, 1, 100); // 100ms timeout + if (p < 0) + { + perror("Accept poll"); + close(fd); + Close(); + return true; + } + if (0 == p) + break; // No more pending connections for now + if (acceptone(fd)) { close(fd);