mercurial/commandserver.py
changeset 49302 ee4537e365c8
parent 49280 311fcc5a65f6
child 49303 dfdf85f37215
equal deleted inserted replaced
49301:c463f45fa114 49302:ee4537e365c8
   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