comparison mercurial/commandserver.py @ 30919:a95fc01aaffe

commandserver: prevent unlink socket twice This patch changes unixforkingservice so it only calls `self._servicehandler.unlinksocket(self.address)` at most once. This is needed by the next patch.
author Jun Wu <quark@fb.com>
date Wed, 08 Feb 2017 14:37:38 -0800
parents 20a42325fdef
children b1b36c6499c2
comparison
equal deleted inserted replaced
30918:2aaa8bfc7bd9 30919:a95fc01aaffe
445 raise error.Abort(_('no socket path specified with --address')) 445 raise error.Abort(_('no socket path specified with --address'))
446 self._servicehandler = handler or unixservicehandler(ui) 446 self._servicehandler = handler or unixservicehandler(ui)
447 self._sock = None 447 self._sock = None
448 self._oldsigchldhandler = None 448 self._oldsigchldhandler = None
449 self._workerpids = set() # updated by signal handler; do not iterate 449 self._workerpids = set() # updated by signal handler; do not iterate
450 self._socketunlinked = None
450 451
451 def init(self): 452 def init(self):
452 self._sock = socket.socket(socket.AF_UNIX) 453 self._sock = socket.socket(socket.AF_UNIX)
453 self._servicehandler.bindsocket(self._sock, self.address) 454 self._servicehandler.bindsocket(self._sock, self.address)
454 self._sock.listen(socket.SOMAXCONN) 455 self._sock.listen(socket.SOMAXCONN)
455 o = signal.signal(signal.SIGCHLD, self._sigchldhandler) 456 o = signal.signal(signal.SIGCHLD, self._sigchldhandler)
456 self._oldsigchldhandler = o 457 self._oldsigchldhandler = o
457 self._servicehandler.printbanner(self.address) 458 self._servicehandler.printbanner(self.address)
459 self._socketunlinked = False
460
461 def _unlinksocket(self):
462 if not self._socketunlinked:
463 self._servicehandler.unlinksocket(self.address)
464 self._socketunlinked = True
458 465
459 def _cleanup(self): 466 def _cleanup(self):
460 signal.signal(signal.SIGCHLD, self._oldsigchldhandler) 467 signal.signal(signal.SIGCHLD, self._oldsigchldhandler)
461 self._sock.close() 468 self._sock.close()
462 self._servicehandler.unlinksocket(self.address) 469 self._unlinksocket()
463 # don't kill child processes as they have active clients, just wait 470 # don't kill child processes as they have active clients, just wait
464 self._reapworkers(0) 471 self._reapworkers(0)
465 472
466 def run(self): 473 def run(self):
467 try: 474 try: