##// END OF EJS Templates
py3: remove retry on EINTR errno...
Manuel Jacob -
r50197:ee4537e3 default
parent child Browse files
Show More
@@ -650,12 +650,7 b' class unixforkingservice:'
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.
@@ -688,12 +683,7 b' class unixforkingservice:'
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):
@@ -704,8 +694,6 b' class unixforkingservice:'
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()?)
@@ -716,14 +716,7 b' def poll(fds):'
716
716
717 In unsupported cases, it will raise a NotImplementedError"""
717 In unsupported cases, it will raise a NotImplementedError"""
718 try:
718 try:
719 while True:
719 res = select.select(fds, fds, fds)
720 try:
721 res = select.select(fds, fds, fds)
722 break
723 except select.error as inst:
724 if inst.args[0] == errno.EINTR:
725 continue
726 raise
727 except ValueError: # out of range file descriptor
720 except ValueError: # out of range file descriptor
728 raise NotImplementedError()
721 raise NotImplementedError()
729 return sorted(list(set(sum(res, []))))
722 return sorted(list(set(sum(res, []))))
@@ -6,7 +6,6 b''
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8
8
9 import errno
10 import threading
9 import threading
11 import time
10 import time
12
11
@@ -65,25 +64,6 b' def fmtremaining(seconds):'
65 return _(b"%dy%02dw") % (years, weeks)
64 return _(b"%dy%02dw") % (years, weeks)
66
65
67
66
68 # file_write() and file_flush() of Python 2 do not restart on EINTR if
69 # the file is attached to a "slow" device (e.g. a terminal) and raise
70 # IOError. We cannot know how many bytes would be written by file_write(),
71 # but a progress text is known to be short enough to be written by a
72 # single write() syscall, so we can just retry file_write() with the whole
73 # text. (issue5532)
74 #
75 # This should be a short-term workaround. We'll need to fix every occurrence
76 # of write() to a terminal or pipe.
77 def _eintrretry(func, *args):
78 while True:
79 try:
80 return func(*args)
81 except IOError as err:
82 if err.errno == errno.EINTR:
83 continue
84 raise
85
86
87 class progbar:
67 class progbar:
88 def __init__(self, ui):
68 def __init__(self, ui):
89 self.ui = ui
69 self.ui = ui
@@ -207,10 +187,10 b' class progbar:'
207 self._flusherr()
187 self._flusherr()
208
188
209 def _flusherr(self):
189 def _flusherr(self):
210 _eintrretry(self.ui.ferr.flush)
190 self.ui.ferr.flush()
211
191
212 def _writeerr(self, msg):
192 def _writeerr(self, msg):
213 _eintrretry(self.ui.ferr.write, msg)
193 self.ui.ferr.write(msg)
214
194
215 def width(self):
195 def width(self):
216 tw = self.ui.termwidth()
196 tw = self.ui.termwidth()
@@ -184,20 +184,15 b' def _posixworker(ui, func, staticargs, a'
184 def waitforworkers(blocking=True):
184 def waitforworkers(blocking=True):
185 for pid in pids.copy():
185 for pid in pids.copy():
186 p = st = 0
186 p = st = 0
187 while True:
187 try:
188 try:
188 p, st = os.waitpid(pid, (0 if blocking else os.WNOHANG))
189 p, st = os.waitpid(pid, (0 if blocking else os.WNOHANG))
189 except OSError as e:
190 break
190 if e.errno == errno.ECHILD:
191 except OSError as e:
191 # child would already be reaped, but pids yet been
192 if e.errno == errno.EINTR:
192 # updated (maybe interrupted just after waitpid)
193 continue
193 pids.discard(pid)
194 elif e.errno == errno.ECHILD:
194 else:
195 # child would already be reaped, but pids yet been
195 raise
196 # updated (maybe interrupted just after waitpid)
197 pids.discard(pid)
198 break
199 else:
200 raise
201 if not p:
196 if not p:
202 # skip subsequent steps, because child process should
197 # skip subsequent steps, because child process should
203 # be still running in this case
198 # be still running in this case
@@ -302,10 +297,6 b' def _posixworker(ui, func, staticargs, a'
302 key.fileobj.close()
297 key.fileobj.close()
303 # pytype: enable=attribute-error
298 # pytype: enable=attribute-error
304 openpipes -= 1
299 openpipes -= 1
305 except IOError as e:
306 if e.errno == errno.EINTR:
307 continue
308 raise
309 except: # re-raises
300 except: # re-raises
310 killworkers()
301 killworkers()
311 cleanup()
302 cleanup()
General Comments 0
You need to be logged in to leave comments. Login now