# include <unistd.h>
# endif
# include <sys/wait.h>
-# ifndef CXX_GLOBAL_CSTD
- using std::signal;
- using std::strerror;
-# endif
#endif
-using boost::bind;
-
-using std::endl;
-using std::equal_to;
-using std::find_if;
-using std::string;
-using std::vector;
+using namespace std;
+using boost::bind;
namespace lyx {
namespace support {
{
if (pid_ != 0)
support::kill(pid_, SIGKILL);
- lyxerr << "Killed " << pid_ << std::endl;
+ lyxerr << "Killed " << pid_ << endl;
delete this;
}
{}
+bool ForkedProcess::IAmAChild = false;
+
+
void ForkedProcess::emitSignal()
{
if (signal_.get()) {
pid_ = generateChild();
if (pid_ <= 0) { // child or fork failed.
retval_ = 1;
+ if (pid_ == 0)
+ //we also do this in fork(), too, but maybe someone will try
+ //to bypass that
+ IAmAChild = true;
return retval_;
}
return;
}
- int const tolerance = std::max(0, tol);
+ int const tolerance = max(0, tol);
if (tolerance == 0) {
// Kill it dead NOW!
Murder::killItDead(0, pid());
}
+pid_t ForkedProcess::fork() {
+#if !defined (HAVE_FORK)
+ return -1;
+#else
+ pid_t pid = ::fork();
+ if (pid == 0)
+ IAmAChild = true;
+ return pid;
+#endif
+}
+
+
// Wait for child process to finish. Returns returncode from child.
int ForkedProcess::waitForChild()
{
DWORD exit_code = 0;
if (!GetExitCodeProcess(hProcess, &exit_code)) {
lyxerr << "GetExitCodeProcess failed waiting for child\n"
- << getChildErrorMessage() << std::endl;
+ << getChildErrorMessage() << endl;
} else
retval_ = exit_code;
break;
}
case WAIT_FAILED:
lyxerr << "WaitForSingleObject failed waiting for child\n"
- << getChildErrorMessage() << std::endl;
+ << getChildErrorMessage() << endl;
break;
}
for (; ait != aend; ++ait)
if (*ait)
lyxerr << '\t'<< *ait << '\n';
- lyxerr << "</command>" << std::endl;
+ lyxerr << "</command>" << endl;
}
#ifdef _WIN32
namespace ForkedCallQueue {
/// A process in the queue
-typedef std::pair<std::string, ForkedCall::SignalTypePtr> Process;
+typedef pair<string, ForkedCall::SignalTypePtr> Process;
/** Add a process to the queue. Processes are forked sequentially
* only one is running at a time.
* Connect to the returned signal and you'll be informed when
* the process has ended.
*/
-ForkedCall::SignalTypePtr add(std::string const & process);
+ForkedCall::SignalTypePtr add(string const & process);
/// in-progress queue
-static std::queue<Process> callQueue_;
+static queue<Process> callQueue_;
/// flag whether queue is running
static bool running_ = 0;
// Bind our chain caller
pro.second->connect(boost::bind(&ForkedCallQueue::callback, _1, _2));
ForkedCall call;
- // If we fail to fork the process, then emit the signal
- // to tell the outside world that it failed.
+ //If we fail to fork the process, then emit the signal
+ //to tell the outside world that it failed.
if (call.startScript(pro.first, pro.second) > 0)
pro.second->operator()(0,1);
}
(LPTSTR) &t_message, 0, 0
) != 0;
- std::ostringstream ss;
+ ostringstream ss;
ss << "LyX: Error waiting for child: " << error_code;
if (ok) {
namespace ForkedCallsController {
typedef boost::shared_ptr<ForkedProcess> ForkedProcessPtr;
-typedef std::list<ForkedProcessPtr> ListType;
+typedef list<ForkedProcessPtr> ListType;
typedef ListType::iterator iterator;
DWORD exit_code = 0;
if (!GetExitCodeProcess(hProcess, &exit_code)) {
lyxerr << "GetExitCodeProcess failed waiting for child\n"
- << getChildErrorMessage() << std::endl;
+ << getChildErrorMessage() << endl;
// Child died, so pretend it returned 1
actCall->setRetValue(1);
} else {
}
case WAIT_FAILED:
lyxerr << "WaitForSingleObject failed waiting for child\n"
- << getChildErrorMessage() << std::endl;
+ << getChildErrorMessage() << endl;
actCall->setRetValue(1);
remove_it = true;
break;