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 |
|
|
190 | self.ui.ferr.flush() | |
211 |
|
191 | |||
212 | def _writeerr(self, msg): |
|
192 | def _writeerr(self, msg): | |
213 |
|
|
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 |
|
|
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 |
|
|
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