Blocks until there's some output from any worker.  No polling.
Exit when all files have been closed.
---
 createrepo/__init__.py |   28 ++++++++++++++--------------
 1 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/createrepo/__init__.py b/createrepo/__init__.py
index d2e2039..5c8ef6a 100644
--- a/createrepo/__init__.py
+++ b/createrepo/__init__.py
@@ -26,6 +26,7 @@ import tempfile
 import stat
 import fcntl
 import subprocess
+from select import select
 
 from yum import misc, Errors
 from yum.repoMDObject import RepoMD, RepoData
@@ -650,6 +651,7 @@ class MetaDataGenerator:
             
                 
 
+            fds = {}
             for (num, cmdline) in worker_cmd_dict.items():
                 if not self.conf.quiet:
                     self.callback.log("Spawning worker %s with %s pkgs" % 
(num, 
@@ -657,22 +659,20 @@ class MetaDataGenerator:
                 job = subprocess.Popen(cmdline, stdout=subprocess.PIPE,
                                         stderr=subprocess.PIPE)
                 worker_jobs[num] = job
+                fds[job.stdout.fileno()] = num, job.stdout, self.callback.log
+                fds[job.stderr.fileno()] = num, job.stderr, 
self.callback.errorlog
             
-            gimmebreak = 0
-            while gimmebreak != len(worker_jobs.keys()):
-                gimmebreak = 0
-                for (num,job) in worker_jobs.items():
-                    if job.poll() is not None:
-                        gimmebreak+=1
-                    line = job.stdout.readline()
-                    if line:
-                        self.callback.log('Worker %s: %s' % (num, 
line.rstrip()))
-                    line = job.stderr.readline()
-                    if line:
-                        self.callback.errorlog('Worker %s: %s' % (num, 
line.rstrip()))
-                    
+            while fds:
+                for fd in select(fds, [], [])[0]:
+                    num, stream, logger = fds[fd]
+                    line = stream.readline()
+                    if line == '':
+                        del fds[fd]
+                        continue
+                    logger('Worker %s: %s' % (num, line.rstrip()))
+
             for (num, job) in worker_jobs.items():
-                if job.returncode != 0:
+                if job.poll() != 0:
                     msg = "Worker exited with non-zero value: %s. Fatal." % 
job.returncode
                     self.callback.errorlog(msg)
                     raise MDError, msg
-- 
1.7.4.4

_______________________________________________
Yum-devel mailing list
[email protected]
http://lists.baseurl.org/mailman/listinfo/yum-devel

Reply via email to