Changeset: 11f5b3648314 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=11f5b3648314
Modified Files:
        testing/process.py
Branch: mtest
Log Message:

Improve speed of tests with lots of output.


diffs (99 lines):

diff --git a/testing/process.py b/testing/process.py
--- a/testing/process.py
+++ b/testing/process.py
@@ -82,6 +82,8 @@ class _BufferedPipe:
     def __init__(self, fd):
         self._pipe = fd
         self._queue = queue.Queue()
+        self._cur = None
+        self._curidx = 0
         self._eof = False
         self._empty = ''
         self._thread = threading.Thread(target=self._readerthread,
@@ -94,14 +96,17 @@ class _BufferedPipe:
         w = 0
         first = True
         while True:
-            c = fh.read(1)
+            c = fh.read(1024)
             if first:
                 if type(c) is type(b''):
                     self._empty = b''
                 first = False
-            queue.put(c)                # put '' if at EOF
             if not c:
+                queue.put(c)    # put '' if at EOF
                 break
+            c = c.replace('\r', '')
+            if c:
+                queue.put(c)
 
     def close(self):
         if self._thread:
@@ -109,24 +114,38 @@ class _BufferedPipe:
         self._thread = None
 
     def read(self, size=-1):
+        ret = []
+        if self._cur:
+            if size < 0:
+                ret.append(self._cur)
+                self._cur = None
+            else:
+                ret.append(self._cur[self._curidx:self._curidx+size])
+                if self._curidx + size >= len(self._cur):
+                    self._cur = None
+                    self._curidx = 0
+                else:
+                    self._curidx += len(ret[-1])
+                size -= len(ret[-1])
+                if size == 0:
+                    return self._empty.join(ret)
         if self._eof:
+            if ret:
+                return self._empty.join(ret)
             return self._empty
         if size < 0:
             self.close()
-        ret = []
         while size != 0:
             c = self._queue.get()
-            if c == '\r':
-                c = self._queue.get()   # just ignore \r
-            ret.append(c)
-            if size > 0:
-                size -= 1
-            try:
-                # only available as of Python 2.5
-                self._queue.task_done()
-            except AttributeError:
-                # not essential, if not available
-                pass
+            if len(c) > size > 0:
+                ret.append(c[:size])
+                self._cur = c[size:]
+                size = 0
+            else:
+                ret.append(c)
+                if size > 0:
+                    size -= len(c)
+            self._queue.task_done()
             if not c:
                 self._eof = True
                 break                   # EOF
@@ -317,6 +336,7 @@ class client(Popen):
                          stderr=stderr,
                          shell=False,
                          env=env,
+                         encoding='utf-8',
                          text=text)
         if stdout == PIPE:
             self.stdout = _BufferedPipe(self.stdout)
@@ -450,6 +470,7 @@ class server(Popen):
                          shell=False,
                          text=True,
                          bufsize=bufsize,
+                         encoding='utf-8',
                          **kw)
         self.isserver = True
         if stderr == PIPE:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to