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: Ife021382198642a97bbbf0b623e4f24f3d86b2b2
This commit is contained in:
@@ -18,6 +18,7 @@ import getopt
|
|||||||
import getpass
|
import getpass
|
||||||
import imp
|
import imp
|
||||||
import os
|
import os
|
||||||
|
import platform
|
||||||
import re
|
import re
|
||||||
import sha
|
import sha
|
||||||
import shutil
|
import shutil
|
||||||
@@ -57,6 +58,22 @@ def Run(args, **kwargs):
|
|||||||
return subprocess.Popen(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):
|
def LoadInfoDict(zip):
|
||||||
"""Read and parse the META/misc_info.txt key/value pairs from the
|
"""Read and parse the META/misc_info.txt key/value pairs from the
|
||||||
input target files and return a dict."""
|
input target files and return a dict."""
|
||||||
|
@@ -181,6 +181,7 @@ def main(argv):
|
|||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
|
common.CloseInheritedPipes()
|
||||||
main(sys.argv[1:])
|
main(sys.argv[1:])
|
||||||
except common.ExternalError, e:
|
except common.ExternalError, e:
|
||||||
print
|
print
|
||||||
|
@@ -781,6 +781,7 @@ def main(argv):
|
|||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
try:
|
||||||
|
common.CloseInheritedPipes()
|
||||||
main(sys.argv[1:])
|
main(sys.argv[1:])
|
||||||
except common.ExternalError, e:
|
except common.ExternalError, e:
|
||||||
print
|
print
|
||||||
|
Reference in New Issue
Block a user