bitbake: cooker.py: Catch when stdout doesn't have a file descriptor

Currently, there is a check to remove the TOSTOP attribute from
a tty to avoid hangs. It assumes that sys.stdout will have a
file descriptor and this is not always true, some IO classes
will throw exceptions when trying to get its file descriptor.

This will add a check for such cases and avoid throwing an
exception.

[YOCTO #10162]

(Bitbake rev: cb4f8f6efa28ef2b13bc738a0118b876baa15b3e)

Signed-off-by: Mariano Lopez <mariano.lopez@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Mariano Lopez 2016-08-23 07:06:11 +00:00 committed by Richard Purdie
parent de83a8ab6d
commit 355e4ec0b6
1 changed files with 12 additions and 9 deletions

View File

@ -30,7 +30,7 @@ import logging
import multiprocessing import multiprocessing
import sre_constants import sre_constants
import threading import threading
from io import StringIO from io import StringIO, UnsupportedOperation
from contextlib import closing from contextlib import closing
from functools import wraps from functools import wraps
from collections import defaultdict, namedtuple from collections import defaultdict, namedtuple
@ -230,14 +230,17 @@ class BBCooker:
pass pass
# TOSTOP must not be set or our children will hang when they output # TOSTOP must not be set or our children will hang when they output
fd = sys.stdout.fileno() try:
if os.isatty(fd): fd = sys.stdout.fileno()
import termios if os.isatty(fd):
tcattr = termios.tcgetattr(fd) import termios
if tcattr[3] & termios.TOSTOP: tcattr = termios.tcgetattr(fd)
buildlog.info("The terminal had the TOSTOP bit set, clearing...") if tcattr[3] & termios.TOSTOP:
tcattr[3] = tcattr[3] & ~termios.TOSTOP buildlog.info("The terminal had the TOSTOP bit set, clearing...")
termios.tcsetattr(fd, termios.TCSANOW, tcattr) tcattr[3] = tcattr[3] & ~termios.TOSTOP
termios.tcsetattr(fd, termios.TCSANOW, tcattr)
except UnsupportedOperation:
pass
self.command = bb.command.Command(self) self.command = bb.command.Command(self)
self.state = state.initial self.state = state.initial