File lyx-2.0.6-fix_zombies.patch of Package lyx

From 254c5fa439df319e8c71212f946ba74a104be16e Mon Sep 17 00:00:00 2001
From: Guy Rutenberg <guyrutenberg@gmail.com>
Date: Sat, 6 Jul 2013 16:09:50 +0300
Subject: [PATCH] Prevent zobmie process.

Using Systemcall::startscript() with Starttype::DontWait used to create
zombie process, as nobody would collect them. This patch start those
process as detached, hence preventing them from becoming zombies.
---
 src/support/Systemcall.cpp      |   26 ++++++++++++++++----------
 src/support/SystemcallPrivate.h |    2 +-
 2 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/src/support/Systemcall.cpp b/src/support/Systemcall.cpp
index ca80409..f689c0b 100644
--- a/src/support/Systemcall.cpp
+++ b/src/support/Systemcall.cpp
@@ -251,19 +251,17 @@ int Systemcall::startscript(Starttype how, string const & what,
 	SystemcallPrivate d(outfile, errfile);
 
 
-	d.startProcess(cmd, path);
-	if (!d.waitWhile(SystemcallPrivate::Starting, process_events, -1)) {
+	d.startProcess(cmd, path, how == DontWait);
+	if (how == DontWait && d.state == SystemcallPrivate::Running) {
+		return 0;
+	}
+	if (d.state == SystemcallPrivate::Error 
+			|| !d.waitWhile(SystemcallPrivate::Starting, process_events, -1)) {
 		LYXERR0("Systemcall: '" << cmd << "' did not start!");
 		LYXERR0("error " << d.errorMessage());
 		return 10;
 	}
 
-	if (how == DontWait) {
-		QProcess* released = d.releaseProcess();
-		(void) released; // TODO who deletes it?
-		return 0;
-	}
-
 	if (!d.waitWhile(SystemcallPrivate::Running, process_events,
 			 os::timeout_min() * 60 * 1000)) {
 		LYXERR0("Systemcall: '" << cmd << "' did not finish!");
@@ -349,10 +347,18 @@ SystemcallPrivate::SystemcallPrivate(std::string const & sf,
 }
 
 
-void SystemcallPrivate::startProcess(QString const & cmd, string const & path)
+void SystemcallPrivate::startProcess(QString const & cmd, string const & path, bool detached)
 {
 	cmd_ = cmd;
-	if (process_) {
+	if (detached) {
+		state = SystemcallPrivate::Running;
+		if (!QProcess::startDetached(toqstr(latexEnvCmdPrefix(path)) + cmd_)) {
+			state = SystemcallPrivate::Error;
+			return;
+		}
+		QProcess* released = releaseProcess();
+		delete released;
+	} else if (process_) {
 		state = SystemcallPrivate::Starting;
 		process_->start(toqstr(latexEnvCmdPrefix(path)) + cmd_);
 	}
diff --git a/src/support/SystemcallPrivate.h b/src/support/SystemcallPrivate.h
index b8dc17a..6534d07 100644
--- a/src/support/SystemcallPrivate.h
+++ b/src/support/SystemcallPrivate.h
@@ -45,7 +45,7 @@ public:
 	State state;
 
 	bool waitWhile(State, bool processEvents, int timeout = -1);
-	void startProcess(QString const & cmd, std::string const & path);
+	void startProcess(QString const & cmd, std::string const & path, bool detach);
 	
 	int exitCode();
 
-- 
1.7.9.5
openSUSE Build Service is sponsored by