Close inherited PIPE before doing work

Gmake in Darwin has file descriptor leak.
In a full build, ota_from_target_files will inherits
more than 2000 open PIPEs from gmake and fails in a call to select.select().
This change fixes the build by closing the PIPEs before doing real work.

Change-Id: Ie7035d7add0b1da3afb6bf9c2009d40f8c7d29b3
This commit is contained in:
Ying Wang 2010-12-13 16:25:36 -08:00
parent 4a2ecaf5dc
commit 7e6d4e45d9
3 changed files with 19 additions and 0 deletions

View File

@ -18,6 +18,7 @@ import getopt
import getpass
import imp
import os
import platform
import re
import shutil
import subprocess
@ -63,6 +64,22 @@ def Run(args, **kwargs):
return subprocess.Popen(args, **kwargs)
def CloseInheritedPipes():
""" Gmake in MAC OS has file descriptor (PIPE) leak. We close those fds
before doing other work."""
if platform.system() != "Darwin":
return
for d in range(3, 1025):
try:
stat = os.fstat(d)
if stat is not None:
pipebit = stat[0] & 0x1000
if pipebit != 0:
os.close(d)
except OSError:
pass
def LoadInfoDict(zip):
"""Read and parse the META/misc_info.txt key/value pairs from the
input target files and return a dict."""

View File

@ -201,6 +201,7 @@ def main(argv):
if __name__ == '__main__':
try:
common.CloseInheritedPipes()
main(sys.argv[1:])
except common.ExternalError, e:
print

View File

@ -807,6 +807,7 @@ def main(argv):
if __name__ == '__main__':
try:
common.CloseInheritedPipes()
main(sys.argv[1:])
except common.ExternalError, e:
print