Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion BaseTools/Source/Python/build/build.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import platform
import traceback
import multiprocessing
import errno
from threading import Thread,Event,BoundedSemaphore
import threading
from linecache import getlines
Expand Down Expand Up @@ -837,13 +838,22 @@ def StartAutoGen(self,mqueue, DataPipe,SkipAutoGen,PcdMaList,cqueue):
try:
if SkipAutoGen:
return True,0
if sys.platform == "win32":
SafeThreadNumber = self.ThreadNumber
else:
import resource
soft = resource.getrlimit(resource.RLIMIT_NOFILE)[0]
SafeThreadNumber = min(self.ThreadNumber, soft // 3)
if SafeThreadNumber < self.ThreadNumber:
EdkLogger.verbose("AutoGen workers limited to %d to avoid file descriptor exhaustion" % SafeThreadNumber)
feedback_q = mp.Queue()
error_event = mp.Event()
FfsCmd = DataPipe.Get("FfsCommand")
if FfsCmd is None:
FfsCmd = {}
GlobalData.FfsCmd = FfsCmd
auto_workers = [AutoGenWorkerInProcess(mqueue,DataPipe.dump_file,feedback_q,GlobalData.file_lock,cqueue,self.log_q,error_event) for _ in range(self.ThreadNumber)]

auto_workers = [AutoGenWorkerInProcess(mqueue,DataPipe.dump_file,feedback_q,GlobalData.file_lock,cqueue,self.log_q,error_event) for _ in range(SafeThreadNumber)]
self.AutoGenMgr = AutoGenManager(auto_workers,feedback_q,error_event)
self.AutoGenMgr.start()
for w in auto_workers:
Expand Down Expand Up @@ -871,6 +881,10 @@ def StartAutoGen(self,mqueue, DataPipe,SkipAutoGen,PcdMaList,cqueue):
if not rt:
err = UNKNOWN_ERROR
return rt, err
except OSError as e:
if e.errno == errno.EMFILE:
EdkLogger.warn("build", RESOURCE_OVERFLOW, ExtraData="Reached file descriptor limit!\n")
raise
except FatalError as e:
return False, e.args[0]
except:
Expand Down Expand Up @@ -2693,6 +2707,8 @@ def Main():
# All job done, no error found and no exception raised
#
BuildError = False
except OSError as X:
ReturnCode = RESOURCE_UNKNOWN_ERROR
except FatalError as X:
if MyBuild is not None:
# for multi-thread build exits safely
Expand Down
Loading