summaryrefslogtreecommitdiff
path: root/indra/llcommon
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llcommon')
-rw-r--r--indra/llcommon/llprocesslauncher.cpp49
-rw-r--r--indra/llcommon/llprocesslauncher.h19
2 files changed, 48 insertions, 20 deletions
diff --git a/indra/llcommon/llprocesslauncher.cpp b/indra/llcommon/llprocesslauncher.cpp
index 25d64e9e28..e1af49c2fb 100644
--- a/indra/llcommon/llprocesslauncher.cpp
+++ b/indra/llcommon/llprocesslauncher.cpp
@@ -143,18 +143,25 @@ int LLProcessLauncher::launch(void)
bool LLProcessLauncher::isRunning(void)
{
- if(mProcessHandle != 0)
+ mProcessHandle = isRunning(mProcessHandle);
+ return (mProcessHandle != 0);
+}
+
+LLProcessLauncher::ll_pid_t LLProcessLauncher::isRunning(ll_pid_t handle)
+{
+ if (! handle)
+ return 0;
+
+ DWORD waitresult = WaitForSingleObject(handle, 0);
+ if(waitresult == WAIT_OBJECT_0)
{
- DWORD waitresult = WaitForSingleObject(mProcessHandle, 0);
- if(waitresult == WAIT_OBJECT_0)
- {
- // the process has completed.
- mProcessHandle = 0;
- }
+ // the process has completed.
+ return 0;
}
- return (mProcessHandle != 0);
+ return handle;
}
+
bool LLProcessLauncher::kill(void)
{
bool result = true;
@@ -293,19 +300,25 @@ int LLProcessLauncher::launch(void)
bool LLProcessLauncher::isRunning(void)
{
- if(mProcessID != 0)
- {
- // Check whether the process has exited, and reap it if it has.
- if(reap_pid(mProcessID))
- {
- // the process has exited.
- mProcessID = 0;
- }
- }
-
+ mProcessID = isRunning(mProcessID);
return (mProcessID != 0);
}
+LLProcessLauncher::ll_pid_t LLProcessLauncher::isRunning(ll_pid_t pid)
+{
+ if (! pid)
+ return 0;
+
+ // Check whether the process has exited, and reap it if it has.
+ if(reap_pid(pid))
+ {
+ // the process has exited.
+ return 0;
+ }
+
+ return pid;
+}
+
bool LLProcessLauncher::kill(void)
{
bool result = true;
diff --git a/indra/llcommon/llprocesslauncher.h b/indra/llcommon/llprocesslauncher.h
index 1daa980c58..63193abd8f 100644
--- a/indra/llcommon/llprocesslauncher.h
+++ b/indra/llcommon/llprocesslauncher.h
@@ -54,6 +54,8 @@ public:
void addArgument(const std::string &arg);
int launch(void);
+ // isRunning isn't const because, if child isn't running, it clears stored
+ // process ID
bool isRunning(void);
// Attempt to kill the process -- returns true if the process is no longer running when it returns.
@@ -72,10 +74,23 @@ public:
// Accessors for platform-specific process ID
#if LL_WINDOWS
// (Windows flavor unused as of 2012-01-12)
- HANDLE getProcessHandle() { return mProcessHandle; };
+ typedef HANDLE ll_pid_t;
+ HANDLE getProcessHandle() const { return mProcessHandle; }
+ ll_pid_t getProcessID() const { return mProcessHandle; }
#else
- pid_t getProcessID() { return mProcessID; };
+ typedef pid_t ll_pid_t;
+ ll_pid_t getProcessID() const { return mProcessID; };
#endif
+ /**
+ * Test if a process (ll_pid_t obtained from getProcessID()) is still
+ * running. Return is same nonzero ll_pid_t value if still running, else
+ * zero, so you can test it like a bool. But if you want to update a
+ * stored variable as a side effect, you can write code like this:
+ * @code
+ * childpid = LLProcessLauncher::isRunning(childpid);
+ * @endcode
+ */
+ static ll_pid_t isRunning(ll_pid_t);
private:
std::string mExecutable;