On 10/14/2016 03:44 AM, Ed Bartosh wrote: > 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 >> --- >> 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? Yes it will work and is more simple, i'll send v2. alimon > > @@ -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 >