diff options
author | Zac Medico <zmedico@gentoo.org> | 2007-08-03 06:50:27 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2007-08-03 06:50:27 +0000 |
commit | e214c72b7b5a3d102a17bffea9229816d2d28714 (patch) | |
tree | 68cf8fd779a99bf5c63beaf6d8ba37b09c80dcf7 | |
parent | 2c291e994f369cb29da3ab2a4d169e9c669ef20c (diff) | |
download | portage-e214c72b7b5a3d102a17bffea9229816d2d28714.tar.gz portage-e214c72b7b5a3d102a17bffea9229816d2d28714.tar.bz2 portage-e214c72b7b5a3d102a17bffea9229816d2d28714.zip |
In portage.spawn() logging, put the read end of the pipe in O_NONBLOCK mode just once at the beginning. This avoids unnecessary fcntl calls and removes one more opportunity to trigger EAGAIN errors on FreeBSD. (trunk r7548)
svn path=/main/branches/2.1.2/; revision=7549
-rw-r--r-- | pym/portage.py | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/pym/portage.py b/pym/portage.py index ee32634a3..f655a29db 100644 --- a/pym/portage.py +++ b/pym/portage.py @@ -2416,32 +2416,28 @@ def spawn(mystring, mysettings, debug=0, free=0, droppriv=0, sesandbox=0, fakero fd_flags[f] = fcntl.fcntl(f.fileno(), fcntl.F_GETFL) buffsize = 65536 eof = False + # Use non-blocking mode to prevent read + # calls from blocking indefinitely. + try: + fcntl.fcntl(master_file.fileno(), fcntl.F_SETFL, + fd_flags[master_file] | os.O_NONBLOCK) + except EnvironmentError, e: + if e.errno != errno.EAGAIN: + raise + del e + # The EAGAIN error signals eof on FreeBSD. + eof = True 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. - try: - fcntl.fcntl(f.fileno(), fcntl.F_SETFL, - fd_flags[f] | os.O_NONBLOCK) - except EnvironmentError, e: - if e.errno != errno.EAGAIN: - raise - del e - # The EAGAIN error signals eof on FreeBSD. - eof = True - break 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 master_file: buf.tofile(stdout_file) stdout_file.flush() |