From df607bacdd0e8564e5de96daeaac508976b6f8ba Mon Sep 17 00:00:00 2001 From: jules Date: Tue, 5 Aug 2014 10:34:27 +0100 Subject: [PATCH] Added a timeout value to the ChildProcessSlave and ChildProcessMaster classes. --- .../juce_ConnectedChildProcess.cpp | 25 +++++++++++-------- .../interprocess/juce_ConnectedChildProcess.h | 16 ++++++++++-- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp b/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp index 926798c8a5..2c36c2c64e 100644 --- a/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp +++ b/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp @@ -27,7 +27,7 @@ enum { magicMastSlaveConnectionHeader = 0x712baf04 }; static const char* startMessage = "__ipc_st"; static const char* killMessage = "__ipc_k_"; static const char* pingMessage = "__ipc_p_"; -enum { specialMessageSize = 8 }; +enum { specialMessageSize = 8, defaultTimeoutMs = 8000 }; static String getCommandLinePrefix (const String& commandLineUniqueID) { @@ -40,7 +40,7 @@ static String getCommandLinePrefix (const String& commandLineUniqueID) struct ChildProcessPingThread : public Thread, private AsyncUpdater { - ChildProcessPingThread() : Thread ("IPC ping"), timeoutMs (8000) + ChildProcessPingThread (int timeout) : Thread ("IPC ping"), timeoutMs (timeout) { pingReceived(); } @@ -84,8 +84,10 @@ private: struct ChildProcessMaster::Connection : public InterprocessConnection, private ChildProcessPingThread { - Connection (ChildProcessMaster& m, const String& pipeName) - : InterprocessConnection (false, magicMastSlaveConnectionHeader), owner (m) + Connection (ChildProcessMaster& m, const String& pipeName, int timeout) + : InterprocessConnection (false, magicMastSlaveConnectionHeader), + ChildProcessPingThread (timeout), + owner (m) { if (createPipe (pipeName, timeoutMs)) startThread (4); @@ -140,7 +142,7 @@ bool ChildProcessMaster::sendMessageToSlave (const MemoryBlock& mb) return false; } -bool ChildProcessMaster::launchSlaveProcess (const File& executable, const String& commandLineUniqueID) +bool ChildProcessMaster::launchSlaveProcess (const File& executable, const String& commandLineUniqueID, int timeoutMs) { connection = nullptr; jassert (childProcess.kill()); @@ -153,7 +155,7 @@ bool ChildProcessMaster::launchSlaveProcess (const File& executable, const Strin if (childProcess.start (args)) { - connection = new Connection (*this, pipeName); + connection = new Connection (*this, pipeName, timeoutMs <= 0 ? defaultTimeoutMs : timeoutMs); if (connection->isConnected()) { @@ -171,8 +173,10 @@ bool ChildProcessMaster::launchSlaveProcess (const File& executable, const Strin struct ChildProcessSlave::Connection : public InterprocessConnection, private ChildProcessPingThread { - Connection (ChildProcessSlave& p, const String& pipeName) - : InterprocessConnection (false, magicMastSlaveConnectionHeader), owner (p) + Connection (ChildProcessSlave& p, const String& pipeName, int timeout) + : InterprocessConnection (false, magicMastSlaveConnectionHeader), + ChildProcessPingThread (timeout), + owner (p) { connectToPipe (pipeName, timeoutMs); startThread (4); @@ -237,7 +241,8 @@ bool ChildProcessSlave::sendMessageToMaster (const MemoryBlock& mb) } bool ChildProcessSlave::initialiseFromCommandLine (const String& commandLine, - const String& commandLineUniqueID) + const String& commandLineUniqueID, + int timeoutMs) { String prefix (getCommandLinePrefix (commandLineUniqueID)); @@ -248,7 +253,7 @@ bool ChildProcessSlave::initialiseFromCommandLine (const String& commandLine, if (pipeName.isNotEmpty()) { - connection = new Connection (*this, pipeName); + connection = new Connection (*this, pipeName, timeoutMs <= 0 ? defaultTimeoutMs : timeoutMs); if (! connection->isConnected()) connection = nullptr; diff --git a/modules/juce_events/interprocess/juce_ConnectedChildProcess.h b/modules/juce_events/interprocess/juce_ConnectedChildProcess.h index 0b3ec6b043..dbabd685a6 100644 --- a/modules/juce_events/interprocess/juce_ConnectedChildProcess.h +++ b/modules/juce_events/interprocess/juce_ConnectedChildProcess.h @@ -64,10 +64,16 @@ public: The commandLineUniqueID should be a short alphanumeric identifier (no spaces!) that matches the string passed to ChildProcessMaster::launchSlaveProcess(). + The timeoutMs parameter lets you specify how long the child process is allowed + to run without receiving a ping from the master before the master is considered to + have died, and handleConnectionLost() will be called. Passing <= 0 for this timeout + makes it use a default value. + Returns true if the command-line matches and the connection is made successfully. */ bool initialiseFromCommandLine (const String& commandLine, - const String& commandLineUniqueID); + const String& commandLineUniqueID, + int timeoutMs); //============================================================================== /** This will be called to deliver messages from the master process. @@ -141,11 +147,17 @@ public: that gets launched must respond by calling ChildProcessSlave::initialiseFromCommandLine() in its startup code, and must use a matching ID to commandLineUniqueID. + The timeoutMs parameter lets you specify how long the child process is allowed + to go without sending a ping before it is considered to have died and + handleConnectionLost() will be called. Passing <= 0 for this timeout makes + it use a default value. + If this all works, the method returns true, and you can begin sending and receiving messages with the slave process. */ bool launchSlaveProcess (const File& executableToLaunch, - const String& commandLineUniqueID); + const String& commandLineUniqueID, + int timeoutMs = 0); /** This will be called to deliver a message from the slave process. The call will probably be made on a background thread, so be careful with your thread-safety!