Set O_NONBLOCK just for read calls (uses fewer fcntl calls).
authorZac Medico <zmedico@gentoo.org>
Wed, 25 Jul 2007 08:26:13 +0000 (08:26 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 25 Jul 2007 08:26:13 +0000 (08:26 -0000)
svn path=/main/trunk/; revision=7393

pym/portage/__init__.py

index d7af652c648246bfcd0f4d03f252769eb744d30b..54ef005a47a594dbfb545799e372dc3d972ca0f5 100644 (file)
@@ -2484,48 +2484,37 @@ def spawn(mystring, mysettings, debug=0, free=0, droppriv=0, sesandbox=0, fakero
                owtd = []
                ewtd = []
                import array, fcntl, select
-               # Use non-blocking mode to prevent read
-               # calls from blocking indefinitely.
                fd_flags = {}
                for f in iwtd:
                        fd_flags[f] = fcntl.fcntl(f.fileno(), fcntl.F_GETFL)
-                       fcntl.fcntl(f.fileno(), fcntl.F_SETFL,
-                               fd_flags[f] | os.O_NONBLOCK)
                buffsize = 65536
                eof = False
                while not eof:
                        events = select.select(iwtd, owtd, ewtd)
                        for f in events[0]:
+                               # Use non-blocking mode to prevent read
+                               # calls from blocking indefinitely.
+                               fcntl.fcntl(f.fileno(), fcntl.F_SETFL,
+                                       fd_flags[f] | os.O_NONBLOCK)
                                buf = array.array('B')
                                try:
                                        buf.fromfile(f, buffsize)
                                except EOFError:
                                        pass
+                               fcntl.fcntl(f.fileno(), fcntl.F_SETFL, fd_flags[f])
                                if not buf:
                                        eof = True
                                        break
                                # Use blocking mode for writes since we'd rather block than
                                # trigger a EWOULDBLOCK error.
                                if f is stdin_file:
-                                       fcntl.fcntl(master_file.fileno(),
-                                               fcntl.F_SETFL, fd_flags[f])
                                        buf.tofile(master_file)
                                        master_file.flush()
-                                       fcntl.fcntl(master_file.fileno(),
-                                               fcntl.F_SETFL, fd_flags[f] | os.O_NONBLOCK)
                                else:
-                                       # stdout usually shares the O_NONBLOCK flag with stdin
-                                       fcntl.fcntl(stdin_file.fileno(),
-                                               fcntl.F_SETFL, fd_flags[f])
                                        buf.tofile(stdout_file)
                                        stdout_file.flush()
-                                       fcntl.fcntl(stdin_file.fileno(),
-                                               fcntl.F_SETFL, fd_flags[f] | os.O_NONBLOCK)
                                        buf.tofile(log_file)
                                        log_file.flush()
-               # Restore them to blocking mode.
-               for f in iwtd:
-                       fcntl.fcntl(f.fileno(), fcntl.F_SETFL, fd_flags[f])
                log_file.close()
                stdin_file.close()
                stdout_file.close()