# HG changeset patch # User Yuya Nishihara # Date 2016-05-22 04:53:32 # Node ID 42cdba9cfee4e6d4ecbee3541beb7517c4ee0f5a # Parent 6ed452d0f1f1a26949b68279e2be42d782e14f5f commandserver: separate initialization and cleanup of forked process Separated _initworkerprocess() and _serverequest() can be reused when implementing a prefork service. diff --git a/mercurial/commandserver.py b/mercurial/commandserver.py --- a/mercurial/commandserver.py +++ b/mercurial/commandserver.py @@ -342,7 +342,7 @@ class pipeservice(object): sv.cleanup() _restoreio(ui, fin, fout) -def _serverequest(ui, repo, conn, createcmdserver): +def _initworkerprocess(): # use a different process group from the master process, making this # process pass kernel "is_current_pgrp_orphaned" check so signals like # SIGTSTP, SIGTTIN, SIGTTOU are not ignored. @@ -351,6 +351,7 @@ def _serverequest(ui, repo, conn, create # same state inherited from parent. random.seed() +def _serverequest(ui, repo, conn, createcmdserver): fin = conn.makefile('rb') fout = conn.makefile('wb') sv = None @@ -385,8 +386,6 @@ def _serverequest(ui, repo, conn, create except IOError as inst: if inst.errno != errno.EPIPE: raise - # trigger __del__ since ForkingMixIn uses os._exit - gc.collect() class unixservicehandler(object): """Set of pluggable operations for unix-mode services @@ -517,8 +516,12 @@ class unixforkingservice(object): def _serveworker(self, conn): signal.signal(signal.SIGCHLD, self._oldsigchldhandler) + _initworkerprocess() h = self._servicehandler - _serverequest(self.ui, self.repo, conn, h.createcmdserver) + try: + _serverequest(self.ui, self.repo, conn, h.createcmdserver) + finally: + gc.collect() # trigger __del__ since worker process uses os._exit _servicemap = { 'pipe': pipeservice,