Comments
Patch
@@ -252,10 +252,11 @@ class bufferedinputpipe(object):
def __init__(self, input):
self._input = input
self._buffer = []
self._eof = False
+ self._lenbuf = 0
@property
def hasbuffer(self):
"""True is any data is currently buffered
@@ -281,10 +282,11 @@ class bufferedinputpipe(object):
def readline(self, *args, **kwargs):
if 1 < len(self._buffer):
# this should not happen because both read and readline end with a
# _frombuffer call that collapse it.
self._buffer = [''.join(self._buffer)]
+ self._lenbuf = len(self._buffer[0])
lfi = -1
if self._buffer:
lfi = self._buffer[-1].find('\n')
while (not self._eof) and lfi < 0:
self._fillbuffer()
@@ -296,15 +298,10 @@ class bufferedinputpipe(object):
elif 1 < len(self._buffer):
# we need to take previous chunks into account
size += self._lenbuf - len(self._buffer[-1])
return self._frombuffer(size)
- @property
- def _lenbuf(self):
- """return the current lengh of buffered data"""
- return sum(len(d) for d in self._buffer)
-
def _frombuffer(self, size):
"""return at most 'size' data from the buffer
The data are removed from the buffer."""
if size == 0 or not self._buffer:
@@ -315,20 +312,23 @@ class bufferedinputpipe(object):
data = buf[:size]
buf = buf[len(data):]
if buf:
self._buffer = [buf]
+ self._lenbuf = len(buf)
else:
self._buffer = []
+ self._lenbuf = 0
return data
def _fillbuffer(self):
"""read data to the buffer"""
data = os.read(self._input.fileno(), _chunksize)
if not data:
self._eof = True
else:
+ self._lenbuf += len(data)
self._buffer.append(data)
def popen2(cmd, env=None, newlines=False):
# Setting bufsize to -1 lets the system decide the buffer size.
# The default for bufsize is 0, meaning unbuffered. This leads to