changeset 8302:d2ad8c066676

util: simplify pipefilter and avoid subprocess race The subprocess module is not thread safe. Spawning a thread to read the output leads to exceptions like this when Mercurial exits: Exception exceptions.TypeError: TypeError("'NoneType' object is not callable",) in <bound method Popen.__del__ of <subprocess.Popen object at 0x9ed0dcc>> ignored The bug is already reported in the Python bug tracker: http://bugs.python.org/issue1731717
author Martin Geisler <mg@lazybytes.net>
date Thu, 07 May 2009 01:33:44 +0200
parents b0ce2595777b
children db52cc4f2f97
files mercurial/util.py
diffstat 1 files changed, 4 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/util.py	Wed May 06 23:35:20 2009 +0200
+++ b/mercurial/util.py	Thu May 07 01:33:44 2009 +0200
@@ -122,23 +122,10 @@
 
 def pipefilter(s, cmd):
     '''filter string S through command CMD, returning its output'''
-    (pin, pout) = popen2(cmd, 'b')
-    def writer():
-        try:
-            pin.write(s)
-            pin.close()
-        except IOError, inst:
-            if inst.errno != errno.EPIPE:
-                raise
-
-    # we should use select instead on UNIX, but this will work on most
-    # systems, including Windows
-    w = threading.Thread(target=writer)
-    w.start()
-    f = pout.read()
-    pout.close()
-    w.join()
-    return f
+    p = subprocess.Popen(cmd, shell=True, close_fds=closefds,
+                         stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+    pout, perr = p.communicate(s)
+    return pout
 
 def tempfilter(s, cmd):
     '''filter string S through a pair of temporary files with CMD.