648 key.data(key.fileobj, selector) |
648 key.data(key.fileobj, selector) |
649 selector.close() |
649 selector.close() |
650 |
650 |
651 def _acceptnewconnection(self, sock, selector): |
651 def _acceptnewconnection(self, sock, selector): |
652 h = self._servicehandler |
652 h = self._servicehandler |
653 try: |
653 conn, _addr = sock.accept() |
654 conn, _addr = sock.accept() |
|
655 except socket.error as inst: |
|
656 if inst.args[0] == errno.EINTR: |
|
657 return |
|
658 raise |
|
659 |
654 |
660 # Future improvement: On Python 3.7, maybe gc.freeze() can be used |
655 # Future improvement: On Python 3.7, maybe gc.freeze() can be used |
661 # to prevent COW memory from being touched by GC. |
656 # to prevent COW memory from being touched by GC. |
662 # https://instagram-engineering.com/ |
657 # https://instagram-engineering.com/ |
663 # copy-on-write-friendly-python-garbage-collection-ad6ed5233ddf |
658 # copy-on-write-friendly-python-garbage-collection-ad6ed5233ddf |
686 finally: |
681 finally: |
687 os._exit(255) |
682 os._exit(255) |
688 |
683 |
689 def _handlemainipc(self, sock, selector): |
684 def _handlemainipc(self, sock, selector): |
690 """Process messages sent from a worker""" |
685 """Process messages sent from a worker""" |
691 try: |
686 path = sock.recv(32768) # large enough to receive path |
692 path = sock.recv(32768) # large enough to receive path |
|
693 except socket.error as inst: |
|
694 if inst.args[0] == errno.EINTR: |
|
695 return |
|
696 raise |
|
697 self._repoloader.load(path) |
687 self._repoloader.load(path) |
698 |
688 |
699 def _sigchldhandler(self, signal, frame): |
689 def _sigchldhandler(self, signal, frame): |
700 self._reapworkers(os.WNOHANG) |
690 self._reapworkers(os.WNOHANG) |
701 |
691 |
702 def _reapworkers(self, options): |
692 def _reapworkers(self, options): |
703 while self._workerpids: |
693 while self._workerpids: |
704 try: |
694 try: |
705 pid, _status = os.waitpid(-1, options) |
695 pid, _status = os.waitpid(-1, options) |
706 except OSError as inst: |
696 except OSError as inst: |
707 if inst.errno == errno.EINTR: |
|
708 continue |
|
709 if inst.errno != errno.ECHILD: |
697 if inst.errno != errno.ECHILD: |
710 raise |
698 raise |
711 # no child processes at all (reaped by other waitpid()?) |
699 # no child processes at all (reaped by other waitpid()?) |
712 self._workerpids.clear() |
700 self._workerpids.clear() |
713 return |
701 return |