Mercurial > public > mercurial-scm > hg-stable
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) |