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