summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llcommon/llprocess.cpp70
1 files changed, 4 insertions, 66 deletions
diff --git a/indra/llcommon/llprocess.cpp b/indra/llcommon/llprocess.cpp
index 1305c1d764..7ccbdeed01 100644
--- a/indra/llcommon/llprocess.cpp
+++ b/indra/llcommon/llprocess.cpp
@@ -31,6 +31,7 @@
#include "llstring.h"
#include "stringize.h"
#include "llapr.h"
+#include "apr_signal.h"
#include <boost/foreach.hpp>
#include <iostream>
@@ -274,10 +275,10 @@ std::string LLProcess::getStatusString(const std::string& desc, const Status& st
#if LL_WINDOWS
return STRINGIZE(desc << " killed with exception " << std::hex << status.mData);
#else
- return STRINGIZE(desc << " killed by signal " << status.mData);
+ return STRINGIZE(desc << " killed by signal " << status.mData
+ << " (" << apr_signal_description_get(status.mData) << ")");
#endif
-
return STRINGIZE(desc << " in unknown state " << status.mState << " (" << status.mData << ")");
}
@@ -391,72 +392,9 @@ std::ostream& operator<<(std::ostream& out, const LLProcess::Params& params)
static std::string WindowsErrorString(const std::string& operation);
-/**
- * Wrap a Windows Job Object for use in managing child-process lifespan.
- *
- * On Windows, we use a Job Object to constrain the lifespan of any
- * autokill=true child process to the viewer's own lifespan:
- * http://stackoverflow.com/questions/53208/how-do-i-automatically-destroy-child-processes-in-windows
- * (thanks Richard!).
- *
- * We manage it using an LLSingleton for a couple of reasons:
- *
- * # Lazy initialization: if some viewer session never launches a child
- * process, we should never have to create a Job Object.
- * # Cross-DLL support: be wary of C++ statics when multiple DLLs are
- * involved.
- */
-class LLJob: public LLSingleton<LLJob>
-{
-public:
- void assignProcess(const std::string& prog, LLProcess::handle hProcess)
- {
- // If we never managed to initialize this Job Object, can't use it --
- // but don't keep spamming the log, we already emitted warnings when
- // we first tried to create.
- if (! mJob)
- return;
-
- if (! AssignProcessToJobObject(mJob, hProcess))
- {
- LL_WARNS("LLProcess") << WindowsErrorString(STRINGIZE("AssignProcessToJobObject("
- << prog << ")")) << LL_ENDL;
- }
- }
-
-private:
- friend class LLSingleton<LLJob>;
- LLJob():
- mJob(0)
- {
- mJob = CreateJobObject(NULL, NULL);
- if (! mJob)
- {
- LL_WARNS("LLProcess") << WindowsErrorString("CreateJobObject()") << LL_ENDL;
- return;
- }
-
- JOBOBJECT_EXTENDED_LIMIT_INFORMATION jeli = { 0 };
-
- // Configure all child processes associated with this new job object
- // to terminate when the calling process (us!) terminates.
- jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
- if (! SetInformationJobObject(mJob, JobObjectExtendedLimitInformation, &jeli, sizeof(jeli)))
- {
- LL_WARNS("LLProcess") << WindowsErrorString("SetInformationJobObject()") << LL_ENDL;
- // This Job Object is useless to us
- CloseHandle(mJob);
- // prevent assignProcess() from trying to use it
- mJob = 0;
- }
- }
-
- LLProcess::handle mJob;
-};
-
void LLProcess::autokill()
{
- LLJob::instance().assignProcess(mDesc, mProcess.hproc);
+ // hopefully now handled by apr_procattr_autokill_set()
}
LLProcess::handle LLProcess::isRunning(handle h, const std::string& desc)