comparison mercurial/commandserver.py @ 29543:d74b8a4fde3b

commandserver: extract function that serves for the current connection This will be used by new server implementation.
author Yuya Nishihara <yuya@tcha.org>
date Sun, 22 May 2016 12:49:22 +0900
parents 6011ad3b0a42
children 024e8f82f3de
comparison
equal deleted inserted replaced
29542:6011ad3b0a42 29543:d74b8a4fde3b
336 return sv.serve() 336 return sv.serve()
337 finally: 337 finally:
338 sv.cleanup() 338 sv.cleanup()
339 _restoreio(ui, fin, fout) 339 _restoreio(ui, fin, fout)
340 340
341 class _requesthandler(socketserver.BaseRequestHandler): 341 def _serverequest(ui, repo, conn, createcmdserver):
342 def handle(self): 342 if True: # TODO: unindent
343 # use a different process group from the master process, making this 343 # use a different process group from the master process, making this
344 # process pass kernel "is_current_pgrp_orphaned" check so signals like 344 # process pass kernel "is_current_pgrp_orphaned" check so signals like
345 # SIGTSTP, SIGTTIN, SIGTTOU are not ignored. 345 # SIGTSTP, SIGTTIN, SIGTTOU are not ignored.
346 os.setpgid(0, 0) 346 os.setpgid(0, 0)
347 # change random state otherwise forked request handlers would have a 347 # change random state otherwise forked request handlers would have a
348 # same state inherited from parent. 348 # same state inherited from parent.
349 random.seed() 349 random.seed()
350 ui = self.server.ui 350
351
352 conn = self.request
353 fin = conn.makefile('rb') 351 fin = conn.makefile('rb')
354 fout = conn.makefile('wb') 352 fout = conn.makefile('wb')
355 sv = None 353 sv = None
356 try: 354 try:
357 sv = self._createcmdserver(conn, fin, fout) 355 sv = createcmdserver(repo, conn, fin, fout)
358 try: 356 try:
359 sv.serve() 357 sv.serve()
360 # handle exceptions that may be raised by command server. most of 358 # handle exceptions that may be raised by command server. most of
361 # known exceptions are caught by dispatch. 359 # known exceptions are caught by dispatch.
362 except error.Abort as inst: 360 except error.Abort as inst:
385 if inst.errno != errno.EPIPE: 383 if inst.errno != errno.EPIPE:
386 raise 384 raise
387 # trigger __del__ since ForkingMixIn uses os._exit 385 # trigger __del__ since ForkingMixIn uses os._exit
388 gc.collect() 386 gc.collect()
389 387
390 def _createcmdserver(self, conn, fin, fout): 388 class _requesthandler(socketserver.BaseRequestHandler):
389 def handle(self):
390 _serverequest(self.server.ui, self.server.repo, self.request,
391 self._createcmdserver)
392
393 def _createcmdserver(self, repo, conn, fin, fout):
391 ui = self.server.ui 394 ui = self.server.ui
392 repo = self.server.repo
393 return server(ui, repo, fin, fout) 395 return server(ui, repo, fin, fout)
394 396
395 class unixservice(object): 397 class unixservice(object):
396 """ 398 """
397 Listens on unix domain socket and forks server per connection 399 Listens on unix domain socket and forks server per connection