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: |