]> xenbits.xensource.com Git - people/aperard/ovmf.git/commitdiff
BaseTools: Enable block queue log agent.
authorFeng, Bob C <bob.c.feng@intel.com>
Wed, 31 Jul 2019 05:33:31 +0000 (13:33 +0800)
committerFeng, Bob C <bob.c.feng@intel.com>
Fri, 9 Aug 2019 15:15:55 +0000 (23:15 +0800)
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1875

To support Ctrl+S and Ctrl+Q, we enable block queue
for log.

Cc: Liming Gao <liming.gao@intel.com>
Signed-off-by: Bob Feng <bob.c.feng@intel.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
Acked-by: Liming Gao <liming.gao@intel.com>
BaseTools/Source/Python/AutoGen/AutoGenWorker.py
BaseTools/Source/Python/Common/EdkLogger.py
BaseTools/Source/Python/build/build.py

index 0a3c1d8e0ebd02967a4d3f04ad63a5c15fb070a0..e583828741bd192152b79de923b5acfc5cc8b19e 100644 (file)
@@ -23,13 +23,14 @@ except:
 import traceback\r
 import sys\r
 from AutoGen.DataPipe import MemoryDataPipe\r
+import logging\r
+\r
 def clearQ(q):\r
     try:\r
         while True:\r
             q.get_nowait()\r
     except Empty:\r
         pass\r
-import logging\r
 \r
 class LogAgent(threading.Thread):\r
     def __init__(self,log_q,log_level,log_file=None):\r
@@ -123,9 +124,10 @@ class AutoGenManager(threading.Thread):
 \r
     def clearQueue(self):\r
         taskq = self.autogen_workers[0].module_queue\r
+        logq = self.autogen_workers[0].log_q\r
         clearQ(taskq)\r
         clearQ(self.feedback_q)\r
-\r
+        clearQ(logq)\r
     def TerminateWorkers(self):\r
         self.error_event.set()\r
     def kill(self):\r
index 15fd1458a95ac85fd959945d20084e2adb22b675..06da4a9d0a1d0be96994d1041be6003da66fab41 100644 (file)
@@ -95,7 +95,9 @@ except:
                 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
@@ -292,19 +294,19 @@ def LogClientInitialize(log_q):
     #\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
index f80060a127e8c01e3329d4c88ded19e7c116e808..4de3f43c27100cf189e44998ac9189ffba0d541c 100644 (file)
@@ -709,7 +709,7 @@ class Build():
         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
@@ -882,19 +882,6 @@ class Build():
                 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
@@ -912,7 +899,7 @@ class Build():
                                     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
@@ -2056,12 +2043,13 @@ class Build():
                     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
@@ -2297,7 +2285,21 @@ def LogBuildTime(Time):
         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
@@ -2307,13 +2309,14 @@ def LogBuildTime(Time):
 #   @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