[PATCH 2 of 4] commandserver: separate initialization and cleanup of forked process

Yuya Nishihara yuya at tcha.org
Sun Jul 17 10:03:00 EDT 2016


# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1463892812 -32400
#      Sun May 22 13:53:32 2016 +0900
# Node ID 57f747c19205d4dc0e1f0813860d4c625f400b67
# Parent  3df2dc92d3a7c47cd79bd7ad44d6c3bf5679dbda
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
@@ -339,7 +339,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.
@@ -348,6 +348,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
@@ -382,8 +383,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
@@ -514,8 +513,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,


More information about the Mercurial-devel mailing list