comparison mercurial/commandserver.py @ 29513:e5b4d79a9140

commandserver: backport handling of forking server from chgserver This is common between chg and vanilla forking server, so move it to commandserver and unify handle(). It would be debatable whether we really need gc.collect() or not, but that is beyond the scope of this series. Maybe we can remove gc.collect() once all resource deallocations are switched to context manager.
author Yuya Nishihara <yuya@tcha.org>
date Sat, 21 May 2016 15:23:21 +0900
parents 538d0003c9e0
children dda6bf886839
comparison
equal deleted inserted replaced
29512:538d0003c9e0 29513:e5b4d79a9140
6 # GNU General Public License version 2 or any later version. 6 # GNU General Public License version 2 or any later version.
7 7
8 from __future__ import absolute_import 8 from __future__ import absolute_import
9 9
10 import errno 10 import errno
11 import gc
11 import os 12 import os
13 import random
12 import struct 14 import struct
13 import sys 15 import sys
14 import traceback 16 import traceback
15 17
16 from .i18n import _ 18 from .i18n import _
336 sv.cleanup() 338 sv.cleanup()
337 _restoreio(ui, fin, fout) 339 _restoreio(ui, fin, fout)
338 340
339 class _requesthandler(socketserver.StreamRequestHandler): 341 class _requesthandler(socketserver.StreamRequestHandler):
340 def handle(self): 342 def handle(self):
343 # use a different process group from the master process, making this
344 # process pass kernel "is_current_pgrp_orphaned" check so signals like
345 # SIGTSTP, SIGTTIN, SIGTTOU are not ignored.
346 os.setpgid(0, 0)
347 # change random state otherwise forked request handlers would have a
348 # same state inherited from parent.
349 random.seed()
341 ui = self.server.ui 350 ui = self.server.ui
342 sv = None 351 sv = None
343 try: 352 try:
344 sv = self._createcmdserver() 353 sv = self._createcmdserver()
345 try: 354 try:
362 cerr = sv.cerr 371 cerr = sv.cerr
363 else: 372 else:
364 cerr = channeledoutput(self.wfile, 'e') 373 cerr = channeledoutput(self.wfile, 'e')
365 traceback.print_exc(file=cerr) 374 traceback.print_exc(file=cerr)
366 raise 375 raise
376 finally:
377 # trigger __del__ since ForkingMixIn uses os._exit
378 gc.collect()
367 379
368 def _createcmdserver(self): 380 def _createcmdserver(self):
369 ui = self.server.ui 381 ui = self.server.ui
370 repo = self.server.repo 382 repo = self.server.repo
371 return server(ui, repo, self.rfile, self.wfile) 383 return server(ui, repo, self.rfile, self.wfile)