diff options
| author | Chris Larson <chris_larson@mentor.com> | 2011-04-04 11:31:39 -0700 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2011-05-06 15:48:22 +0100 |
| commit | 37cb4cc02b2e2b6c338c5943747e0a1ef15176b3 (patch) | |
| tree | 454bba6a6c191c834ff26903137e4ba130873b18 /bitbake/lib | |
| parent | 8cf28d706b7e70f5835b1bd4da058ec64f520c6c (diff) | |
| download | poky-37cb4cc02b2e2b6c338c5943747e0a1ef15176b3.tar.gz | |
event: improve output when eventhandler exec fails
- Name the event handler by its actual name, so the traceback shows it rather
than 'tmpHandler'.
- Rather than immediately aborting when encountering an event handler error,
display an error message and try to continue.
- Show a traceback for ordinary exceptions, skipping the first entry in the
traceback, so it only shows the useful information.
- Show an error, but no traceback, for SystemExit with a code other than 0.
- For for SystemExit with a code of 0, simply continue silently.
(Bitbake rev: faf682dfc23b7ef2ece04f7d50f9741224bb3bb0)
Signed-off-by: Chris Larson <chris_larson@mentor.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib')
| -rw-r--r-- | bitbake/lib/bb/event.py | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py index 9a07ed5c0a..ec6446d64c 100644 --- a/bitbake/lib/bb/event.py +++ b/bitbake/lib/bb/event.py | |||
| @@ -37,6 +37,8 @@ import bb.utils | |||
| 37 | worker_pid = 0 | 37 | worker_pid = 0 |
| 38 | worker_pipe = None | 38 | worker_pipe = None |
| 39 | 39 | ||
| 40 | logger = logging.getLogger('BitBake.Event') | ||
| 41 | |||
| 40 | class Event(object): | 42 | class Event(object): |
| 41 | """Base class for events""" | 43 | """Base class for events""" |
| 42 | 44 | ||
| @@ -58,18 +60,35 @@ _ui_handler_seq = 0 | |||
| 58 | bb.utils._context["NotHandled"] = NotHandled | 60 | bb.utils._context["NotHandled"] = NotHandled |
| 59 | bb.utils._context["Handled"] = Handled | 61 | bb.utils._context["Handled"] = Handled |
| 60 | 62 | ||
| 63 | def execute_handler(name, handler, event, d): | ||
| 64 | event.data = d | ||
| 65 | try: | ||
| 66 | ret = handler(event) | ||
| 67 | except Exception: | ||
| 68 | etype, value, tb = sys.exc_info() | ||
| 69 | logger.error("Execution of event handler '%s' failed" % name, | ||
| 70 | exc_info=(etype, value, tb.tb_next)) | ||
| 71 | raise | ||
| 72 | except SystemExit as exc: | ||
| 73 | if exc.code != 0: | ||
| 74 | logger.error("Execution of event handler '%s' failed" % name) | ||
| 75 | raise | ||
| 76 | finally: | ||
| 77 | del event.data | ||
| 78 | |||
| 79 | if ret is not None: | ||
| 80 | warnings.warn("Using Handled/NotHandled in event handlers is deprecated", | ||
| 81 | DeprecationWarning, stacklevel = 2) | ||
| 82 | |||
| 61 | def fire_class_handlers(event, d): | 83 | def fire_class_handlers(event, d): |
| 62 | if isinstance(event, logging.LogRecord): | 84 | if isinstance(event, logging.LogRecord): |
| 63 | return | 85 | return |
| 64 | 86 | ||
| 65 | for handler in _handlers.itervalues(): | 87 | for name, handler in _handlers.iteritems(): |
| 66 | event.data = d | 88 | try: |
| 67 | ret = handler(event) | 89 | execute_handler(name, handler, event, d) |
| 68 | if ret is not None: | 90 | except BaseException: |
| 69 | warnings.warn("Using Handled/NotHandled in event handlers is deprecated", | 91 | continue |
| 70 | DeprecationWarning, stacklevel = 2) | ||
| 71 | |||
| 72 | del event.data | ||
| 73 | 92 | ||
| 74 | ui_queue = [] | 93 | ui_queue = [] |
| 75 | @atexit.register | 94 | @atexit.register |
| @@ -141,11 +160,12 @@ def register(name, handler): | |||
| 141 | if handler is not None: | 160 | if handler is not None: |
| 142 | # handle string containing python code | 161 | # handle string containing python code |
| 143 | if isinstance(handler, basestring): | 162 | if isinstance(handler, basestring): |
| 144 | tmp = "def tmpHandler(e):\n%s" % handler | 163 | tmp = "def %s(e):\n%s" % (name, handler) |
| 145 | comp = bb.utils.better_compile(tmp, "tmpHandler(e)", "bb.event._registerCode") | 164 | comp = bb.utils.better_compile(tmp, "%s(e)" % name, |
| 165 | "bb.event._registerCode") | ||
| 146 | env = {} | 166 | env = {} |
| 147 | bb.utils.simple_exec(comp, env) | 167 | bb.utils.simple_exec(comp, env) |
| 148 | func = bb.utils.better_eval("tmpHandler", env) | 168 | func = bb.utils.better_eval(name, env) |
| 149 | _handlers[name] = func | 169 | _handlers[name] = func |
| 150 | else: | 170 | else: |
| 151 | _handlers[name] = handler | 171 | _handlers[name] = handler |
