From e550b46c4b73fbfc5d0b4c9ed0778bbc57c75dbd Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Fri, 19 Jun 2026 12:20:13 -0400 Subject: [PATCH] fix issue with SysView in WebSocket mode dieing and not starting network services; --- configs/fne-sysview.example.yml | 3 +++ src/sysview/HostWS.cpp | 6 ++++++ src/sysview/SysViewMain.cpp | 23 ++++++++++++++++++++--- src/sysview/SysViewMain.h | 6 ++++++ 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/configs/fne-sysview.example.yml b/configs/fne-sysview.example.yml index cd95bb1a..b98ba958 100644 --- a/configs/fne-sysview.example.yml +++ b/configs/fne-sysview.example.yml @@ -22,6 +22,9 @@ # file. # +# Flag indicating whether the host will run as a background or foreground task. +daemon: false + # # Logging Configuration (only used in WebSocket mode) # diff --git a/src/sysview/HostWS.cpp b/src/sysview/HostWS.cpp index 1925955c..ddab6aa5 100644 --- a/src/sysview/HostWS.cpp +++ b/src/sysview/HostWS.cpp @@ -226,6 +226,12 @@ int HostWS::run() if (!ret) return EXIT_FAILURE; + // In daemon websocket mode, run the network pump in the post-fork child. + if (m_daemon) { + if (!startNetworkPumpThread()) + return EXIT_FAILURE; + } + yaml::Node fne = g_conf["fne"]; std::string fneRESTAddress = fne["restAddress"].as("127.0.0.1"); uint16_t fneRESTPort = (uint16_t)fne["restPort"].as(9990U); diff --git a/src/sysview/SysViewMain.cpp b/src/sysview/SysViewMain.cpp index 8deeb53c..1c2c649e 100644 --- a/src/sysview/SysViewMain.cpp +++ b/src/sysview/SysViewMain.cpp @@ -1053,6 +1053,13 @@ void* threadNetworkPump(void* arg) return nullptr; } +/* Starts the network pump worker thread. */ + +bool startNetworkPumpThread() +{ + return Thread::runAsThread(nullptr, threadNetworkPump); +} + /* Helper to pring usage the command line arguments. (And optionally an error.) */ void usage(const char* message, const char* arg) @@ -1209,9 +1216,19 @@ int main(int argc, char** argv) ::fatal("cannot read the configuration file - %s (%s)", g_iniFile.c_str(), e.message()); } - /** Network Thread */ - if (!Thread::runAsThread(nullptr, threadNetworkPump)) - return EXIT_FAILURE; + bool wsDaemonMode = false; +#if !defined(NO_WEBSOCKETS) + if (g_webSocketMode) { + bool daemon = g_conf["daemon"].as(false); + wsDaemonMode = daemon && !g_foreground; + } +#endif // !defined(NO_WEBSOCKETS) + + // In websocket daemon mode HostWS forks, so the child must start the network pump. + if (!wsDaemonMode) { + if (!startNetworkPumpThread()) + return EXIT_FAILURE; + } finalcut::FApplication::setColorTheme(); diff --git a/src/sysview/SysViewMain.h b/src/sysview/SysViewMain.h index 3d6d9998..783c591d 100644 --- a/src/sysview/SysViewMain.h +++ b/src/sysview/SysViewMain.h @@ -109,6 +109,12 @@ extern HOST_SW_API std::string resolveTGID(uint32_t id); */ extern HOST_SW_API bool createPeerNetwork(); +/** + * @brief Starts the network pump worker thread. + * @returns bool True, if the thread was started successfully, otherwise false. + */ +extern HOST_SW_API bool startNetworkPumpThread(); + /** * @brief * @returns PeerNetwork*