[PATCH 1 of 1] Replacing select call with a thread to accumulate the error output

Zbynek Winkler zwin at users.sourceforge.net
Tue Sep 27 07:35:01 CDT 2005


Zbynek Winkler wrote:

># HG changeset patch
># User zbynek at localhost
># Node ID 3aaf4b5f48cdf7b0d0b4c20c36e2de27ce3b6a23
># Parent  0e2be889ccd7eaf0c5c1f08b486e02be3ec7358f
>Replacing select call with a thread to accumulate the error output.
>
>diff -r 0e2be889ccd7 -r 3aaf4b5f48cd mercurial/sshrepo.py
>--- a/mercurial/sshrepo.py	Mon Sep 26 16:52:47 2005 -0700
>+++ b/mercurial/sshrepo.py	Tue Sep 27 14:09:58 2005 +0200
>@@ -8,7 +8,7 @@
> from node import *
> from remoterepo import *
> from demandload import *
>-demandload(globals(), "hg os re select")
>+demandload(globals(), "hg os re threading")
> 
> class sshrepository(remoterepository):
>     def __init__(self, ui, path):
>@@ -35,21 +35,33 @@
>         ui.note('running %s\n' % cmd)
>         self.pipeo, self.pipei, self.pipee = os.popen3(cmd, 'b')
> 
>+        def accumerr():
>+            while 1:
>+                l = self.pipee.readline()
>+                if l == "": return
>+                self.lock.acquire()
>+                self.err.append(l)
>+                self.lock.release()
>+        
>+        self.lock = threading.Lock()
>  
>
Sorry, it shouldn't have been 'lock' as it conflicts with the method of 
the same name.

>+        self.err = []
>+        self.reader = threading.Thread(target=accumerr)
>+        self.reader.setDaemon(1)
>+        self.reader.start()
>+
>     def readerr(self):
>-        while 1:
>-            r,w,x = select.select([self.pipee], [], [], 0)
>-            if not r: break
>-            l = self.pipee.readline()
>-            if not l: break
>+        self.lock.acquire()
>+        for l in self.err:
>             self.ui.status("remote: ", l)
>  
>
I forgot to add self.err = [] here :(

>+        self.lock.release()
> 
>     def __del__(self):
>         try:
>             self.pipeo.close()
>             self.pipei.close()
>-            for l in self.pipee:
>-                self.ui.status("remote: ", l)
>             self.pipee.close()
>+            self.reader.join()
>+            readerr()
>         except:
>             pass
> 
>

-- 
http://zw.matfyz.cz/     http://robotika.cz/
Faculty of Mathematics and Physics, Charles University, Prague, Czech Republic



More information about the Mercurial mailing list