From 5225821242887ff552b7370df9c830af5f17d3b3 Mon Sep 17 00:00:00 2001 From: Scott Kostyshak Date: Tue, 16 Jul 2013 00:39:28 -0400 Subject: [PATCH] Prevent zombie processes (#8774) Using Systemcall::startscript() with Starttype::DontWait used to create zombie processes, as nobody would collect them. This patch starts those processes as detached, hence preventing them from becoming zombies. In addition to #8774, this bug was also reported here: https://bugs.launchpad.net/ubuntu/+source/lyx/+bug/1096666 Patch from Guy Rutenberg. For reference, see this email thread: http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg180034.html --- lib/generate_contributions.py | 8 ++++++++ src/support/Systemcall.cpp | 26 ++++++++++++++++---------- src/support/SystemcallPrivate.h | 2 +- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/lib/generate_contributions.py b/lib/generate_contributions.py index 6efe84ef58..3a995e7518 100755 --- a/lib/generate_contributions.py +++ b/lib/generate_contributions.py @@ -1475,6 +1475,14 @@ contributers = [ "25 September 2007", u"Major rework of the AMS classes"), + contributer(u"Guy Rutenberg", + "guyrutenberg () gmail ! com", + "GPL", + "Re: [PATCH] Strange Behaivor: xdg-open left as zombie", + "m=137365070116624", + "12 July 2013", + u"System call fixes"), + contributer(u"Ran Rutenberg", "ran.rutenberg () gmail ! com", "GPL", diff --git a/src/support/Systemcall.cpp b/src/support/Systemcall.cpp index ca80409660..0ab7685b5c 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(infile, 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 b8dc17a23d..6534d07faa 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(); -- 2.39.2