##// END OF EJS Templates
progress: retry ferr.flush() and .write() on EINTR (issue5532)...
Yuya Nishihara -
r32049:ed42e00a default
parent child Browse files
Show More
@@ -7,6 +7,7 b''
7
7
8 from __future__ import absolute_import
8 from __future__ import absolute_import
9
9
10 import errno
10 import threading
11 import threading
11 import time
12 import time
12
13
@@ -60,6 +61,24 b' def fmtremaining(seconds):'
60 # i18n: format X years and YY weeks as "XyYYw"
61 # i18n: format X years and YY weeks as "XyYYw"
61 return _("%dy%02dw") % (years, weeks)
62 return _("%dy%02dw") % (years, weeks)
62
63
64 # file_write() and file_flush() of Python 2 do not restart on EINTR if
65 # the file is attached to a "slow" device (e.g. a terminal) and raise
66 # IOError. We cannot know how many bytes would be written by file_write(),
67 # but a progress text is known to be short enough to be written by a
68 # single write() syscall, so we can just retry file_write() with the whole
69 # text. (issue5532)
70 #
71 # This should be a short-term workaround. We'll need to fix every occurrence
72 # of write() to a terminal or pipe.
73 def _eintrretry(func, *args):
74 while True:
75 try:
76 return func(*args)
77 except IOError as err:
78 if err.errno == errno.EINTR:
79 continue
80 raise
81
63 class progbar(object):
82 class progbar(object):
64 def __init__(self, ui):
83 def __init__(self, ui):
65 self.ui = ui
84 self.ui = ui
@@ -179,10 +198,10 b' class progbar(object):'
179 self._flusherr()
198 self._flusherr()
180
199
181 def _flusherr(self):
200 def _flusherr(self):
182 self.ui.ferr.flush()
201 _eintrretry(self.ui.ferr.flush)
183
202
184 def _writeerr(self, msg):
203 def _writeerr(self, msg):
185 self.ui.ferr.write(msg)
204 _eintrretry(self.ui.ferr.write, msg)
186
205
187 def width(self):
206 def width(self):
188 tw = self.ui.termwidth()
207 tw = self.ui.termwidth()
General Comments 0
You need to be logged in to leave comments. Login now