From 6046c8ed46ed92d02ef9cc27446b4e02fccd9ba6 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Wed, 28 Nov 2007 16:10:27 +0100 Subject: [PATCH] Reap only activity processes. Fix #5044 --- bin/sugar-shell | 9 --------- lib/sugar/activity/activityfactory.py | 16 ++++++++++++++-- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/bin/sugar-shell b/bin/sugar-shell index ba36fc90..b0f66b4b 100755 --- a/bin/sugar-shell +++ b/bin/sugar-shell @@ -19,7 +19,6 @@ import sys import os from ConfigParser import ConfigParser import gettext -import signal import pygtk pygtk.require('2.0') @@ -86,12 +85,6 @@ def _shell_started_cb(): hw_manager = hardwaremanager.get_manager() hw_manager.set_dcon_freeze(0) -def _sigchild_handler(signum, frame): - try: - os.wait() - except OSError: - pass - def main(): gobject.idle_add(_shell_started_cb) @@ -111,8 +104,6 @@ def main(): win.show_all() gtk.main() - signal.signal(signal.SIGCHLD, _sigchild_handler) - if os.environ.has_key("SUGAR_TP_DEBUG"): # Allow the user time to start up telepathy connection managers # using the Sugar DBus bus address diff --git a/lib/sugar/activity/activityfactory.py b/lib/sugar/activity/activityfactory.py index 85c0832e..119dceab 100644 --- a/lib/sugar/activity/activityfactory.py +++ b/lib/sugar/activity/activityfactory.py @@ -18,6 +18,7 @@ import logging import subprocess +import signal import dbus import gobject @@ -53,6 +54,16 @@ _RAINBOW_SERVICE_NAME = "org.laptop.security.Rainbow" _RAINBOW_ACTIVITY_FACTORY_PATH = "/" _RAINBOW_ACTIVITY_FACTORY_INTERFACE = "org.laptop.security.Rainbow" +_children_pid = [] + +def _sigchild_handler(signum, frame): + for child_pid in _children_pid: + pid, status = os.waitpid(child_pid, os.WNOHANG) + if pid > 0: + _children_pid.remove(pid) + +signal.signal(signal.SIGCHLD, _sigchild_handler) + def create_activity_id(): """Generate a new, unique ID for this activity""" pservice = presenceservice.get_instance() @@ -224,8 +235,9 @@ class ActivityCreationHandler(gobject.GObject): self._handle.uri) if not self._use_rainbow: - process = subprocess.Popen(command, env=environ, cwd=activity.path, - stdout=log_file, stderr=log_file) + p = subprocess.Popen(command, env=environ, cwd=activity.path, + stdout=log_file, stderr=log_file) + _children_pid.append(p.pid) else: log_file.close() system_bus = dbus.SystemBus()