self.enqueue(self.prepare(record))\r
except Exception:\r
self.handleError(record)\r
-\r
+class BlockQueueHandler(QueueHandler):\r
+ def enqueue(self, record):\r
+ self.queue.put(record,True)\r
## Log level constants\r
DEBUG_0 = 1\r
DEBUG_1 = 2\r
#\r
# For DEBUG level (All DEBUG_0~9 are applicable)\r
_DebugLogger.setLevel(INFO)\r
- _DebugChannel = QueueHandler(log_q)\r
+ _DebugChannel = BlockQueueHandler(log_q)\r
_DebugChannel.setFormatter(_DebugFormatter)\r
_DebugLogger.addHandler(_DebugChannel)\r
\r
# For VERBOSE, INFO, WARN level\r
_InfoLogger.setLevel(INFO)\r
- _InfoChannel = QueueHandler(log_q)\r
+ _InfoChannel = BlockQueueHandler(log_q)\r
_InfoChannel.setFormatter(_InfoFormatter)\r
_InfoLogger.addHandler(_InfoChannel)\r
\r
# For ERROR level\r
_ErrorLogger.setLevel(INFO)\r
- _ErrorCh = QueueHandler(log_q)\r
+ _ErrorCh = BlockQueueHandler(log_q)\r
_ErrorCh.setFormatter(_ErrorFormatter)\r
_ErrorLogger.addHandler(_ErrorCh)\r
\r
self.FvList = BuildOptions.FvImage\r
self.CapList = BuildOptions.CapName\r
self.SilentMode = BuildOptions.SilentMode\r
- self.ThreadNumber = BuildOptions.ThreadNumber\r
+ self.ThreadNumber = 1\r
self.SkipAutoGen = BuildOptions.SkipAutoGen\r
self.Reparse = BuildOptions.Reparse\r
self.SkuId = BuildOptions.SkuId\r
ToolChainFamily.append(ToolDefinition[TAB_TOD_DEFINES_FAMILY][Tool])\r
self.ToolChainFamily = ToolChainFamily\r
\r
- if self.ThreadNumber is None:\r
- self.ThreadNumber = self.TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER]\r
- if self.ThreadNumber == '':\r
- self.ThreadNumber = 0\r
- else:\r
- self.ThreadNumber = int(self.ThreadNumber, 0)\r
-\r
- if self.ThreadNumber == 0:\r
- try:\r
- self.ThreadNumber = multiprocessing.cpu_count()\r
- except (ImportError, NotImplementedError):\r
- self.ThreadNumber = 1\r
-\r
if not self.PlatformFile:\r
PlatformFile = self.TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_ACTIVE_PLATFORM]\r
if not PlatformFile:\r
ExtraData="No active platform specified in target.txt or command line! Nothing can be built.\n")\r
\r
self.PlatformFile = PathClass(NormFile(PlatformFile, self.WorkspaceDir), self.WorkspaceDir)\r
-\r
+ self.ThreadNumber = ThreadNum()\r
## Initialize build configuration\r
#\r
# This method will parse DSC file and merge the configurations from\r
data_pipe_file = os.path.join(Pa.BuildDir, "GlobalVar_%s_%s.bin" % (str(Pa.Guid),Pa.Arch))\r
Pa.DataPipe.dump(data_pipe_file)\r
autogen_rt, errorcode = self.StartAutoGen(mqueue, Pa.DataPipe, self.SkipAutoGen, PcdMaList,self.share_data)\r
- self.Progress.Stop("done!")\r
- self.AutoGenTime += int(round((time.time() - AutoGenStart)))\r
+\r
if not autogen_rt:\r
self.AutoGenMgr.TerminateWorkers()\r
self.AutoGenMgr.join(0.1)\r
raise FatalError(errorcode)\r
+ self.AutoGenTime += int(round((time.time() - AutoGenStart)))\r
+ self.Progress.Stop("done!")\r
for Arch in Wa.ArchList:\r
MakeStart = time.time()\r
for Ma in self.BuildModules:\r
return TimeDurStr\r
else:\r
return None\r
+def ThreadNum():\r
+ ThreadNumber = BuildOption.ThreadNumber\r
+ if ThreadNumber is None:\r
+ ThreadNumber = TargetTxt.TargetTxtDictionary[TAB_TAT_DEFINES_MAX_CONCURRENT_THREAD_NUMBER]\r
+ if ThreadNumber == '':\r
+ ThreadNumber = 0\r
+ else:\r
+ ThreadNumber = int(ThreadNumber, 0)\r
\r
+ if ThreadNumber == 0:\r
+ try:\r
+ ThreadNumber = multiprocessing.cpu_count()\r
+ except (ImportError, NotImplementedError):\r
+ ThreadNumber = 1\r
+ return ThreadNumber\r
## Tool entrance method\r
#\r
# This method mainly dispatch specific methods per the command line options.\r
# @retval 0 Tool was successful\r
# @retval 1 Tool failed\r
#\r
+LogQMaxSize = ThreadNum() * 10\r
def Main():\r
StartTime = time.time()\r
\r
#\r
# Create a log Queue\r
#\r
- LogQ = mp.Queue()\r
+ LogQ = mp.Queue(LogQMaxSize)\r
# Initialize log system\r
EdkLogger.LogClientInitialize(LogQ)\r
GlobalData.gCommand = sys.argv[1:]\r