summaryrefslogtreecommitdiffstats
path: root/pym
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2007-08-03 06:50:27 +0000
committerZac Medico <zmedico@gentoo.org>2007-08-03 06:50:27 +0000
commite214c72b7b5a3d102a17bffea9229816d2d28714 (patch)
tree68cf8fd779a99bf5c63beaf6d8ba37b09c80dcf7 /pym
parent2c291e994f369cb29da3ab2a4d169e9c669ef20c (diff)
downloadportage-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
Diffstat (limited to 'pym')
-rw-r--r--pym/portage.py26
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()