From 27f2051c44a3dd614b391e3f5ae7dca97257f64b Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Tue, 22 Jan 2013 18:31:57 +0100 Subject: Join worker processes and keep track of them in the log This also prevents a zombie from hanging around until the next worker is spawned by multiprocessing. Fixes 411. Signed-off-by: Justus Winter <4winter@informatik.uni-hamburg.de> --- alot/db/manager.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/alot/db/manager.py b/alot/db/manager.py index 535186b5..bf1581ff 100644 --- a/alot/db/manager.py +++ b/alot/db/manager.py @@ -8,6 +8,7 @@ import logging import sys import errno import signal +from twisted.internet import reactor from collections import deque @@ -312,6 +313,23 @@ class DBManager(object): process = FillPipeProcess(cbl(), pipe, fun) process.start() self.processes.append(process) + logging.debug('Worker process {0} spawned'.format(process.pid)) + + def threaded_wait(): + process.join() + + if process.exitcode < 0: + msg = 'received signal {0}'.format(-process.exitcode) + elif process.exitcode > 0: + msg = 'returned error code {0}'.format(process.exitcode) + else: + msg = 'exited successfully' + + logging.debug('Worker process {0} {1}'.format(process.pid, msg)) + self.processes.remove(process) + + reactor.callInThread(threaded_wait) + # closing the sending end in this (receiving) process guarantees # that here the apropriate EOFError is raised upon .recv in the walker sender.close() -- cgit v1.2.3