[bitbake-devel] [PATCH] bb.event: fix infinite loop on print_ui_queue

Ed Bartosh ed.bartosh at linux.intel.com
Fri Oct 14 08:44:08 UTC 2016


On Thu, Oct 13, 2016 at 06:11:34PM -0500, Aníbal Limón wrote:
> If bitbake ends before _uiready and bb.event.LogHandler was add
> to the bitbake logger it causes an infinite loop when logging
> something.
> 
> The scenario is print_ui_queue is called at exit and executes
> the log handlers [2] one of them is bb.event.LogHandler this handler
> appends the same entry to ui_queue causing the inifine loop [3].
> 
> In order to fix we need to keep track of events already handled to
> avoid the infinite loop.
> 
> [YOCTO #10399]
> 
> [1] https://bugzilla.yoctoproject.org/show_bug.cgi?id=10399#c0
> [2] http://git.openembedded.org/bitbake/tree/lib/bb/event.py?id=41d9cd41d40b04746c82b4a940dca47df02514fc#n156
> [3]
> http://git.openembedded.org/bitbake/tree/lib/bb/event.py?id=41d9cd41d40b04746c82b4a940dca47df02514fc#n164
> 
> Signed-off-by: Aníbal Limón <anibal.limon at linux.intel.com>
> ---
>  lib/bb/event.py | 10 ++++++++++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/lib/bb/event.py b/lib/bb/event.py
> index c5a5f94..8464e06 100644
> --- a/lib/bb/event.py
> +++ b/lib/bb/event.py
> @@ -139,7 +139,11 @@ def print_ui_queue():
>  
>          # First check to see if we have any proper messages
>          msgprint = False
> +        events_handled = []
>          for event in ui_queue:
> +            if event in events_handled:
> +                continue
> +
>              if isinstance(event, logging.LogRecord):
>                  if event.levelno > logging.DEBUG:
>                      if event.levelno >= logging.WARNING:
> @@ -148,14 +152,20 @@ def print_ui_queue():
>                          logger.addHandler(stdout)
>                      logger.handle(event)
>                      msgprint = True
> +            events_handled.append(event)
>          if msgprint:
>              return
>  
>          # Nope, so just print all of the messages we have (including debug messages)
>          logger.addHandler(stdout)
> +        events_handled = []
>          for event in ui_queue:
> +            if event in events_handled:
> +                continue
> +
>              if isinstance(event, logging.LogRecord):
>                  logger.handle(event)
> +            events_handled.append(event)
>  
>  def fire_ui_handlers(event, d):
>      global _thread_lock

Would using full slice of ui_queue work the same way?

@@ -139,7 +139,7 @@ def print_ui_queue():

         # First check to see if we have any proper messages
         msgprint = False
-        for event in ui_queue:
+        for event in ui_queue[:]:
             if isinstance(event, logging.LogRecord):
                 if event.levelno > logging.DEBUG:
                     if event.levelno >= logging.WARNING:


--
Regards,
Ed



More information about the bitbake-devel mailing list