Commit 1d523139 authored by Thomas Thrainer's avatar Thomas Thrainer
Browse files

Add an exception-trapping thread class

To have better control over threads, this patch adds a helper Thread
subclass which captures any exceptions occurring for later use.
Signed-off-by: default avatarHrvoje Ribicic <>
Reviewed-by: default avatarPetr Pudlak <>
Signed-off-by: default avatarThomas Thrainer <>
Reviewed-by: default avatarHelga Velroyen <>

(cherry picked from commit e677d5e8)
parent 27aa899e
......@@ -24,6 +24,7 @@
import re
import sys
import threading
import time
......@@ -220,6 +221,40 @@ def _GetBlockingLocks():
return blocking_locks
class QAThread(threading.Thread):
""" An exception-preserving thread that executes a given function.
def __init__(self, fn, args, kwargs):
""" Constructor accepting the function to be invoked later.
self._fn = fn
self._args = args
self._kwargs = kwargs
self._exc_info = None
def run(self):
""" Executes the function, preserving exception info if necessary.
# pylint: disable=W0702
# We explicitly want to catch absolutely anything
self._fn(*self._args, **self._kwargs)
self._exc_info = sys.exc_info()
# pylint: enable=W0702
def reraise(self):
""" Reraises any exceptions that might have occured during thread execution.
if self._exc_info is not None:
raise self._exc_info[0], self._exc_info[1], self._exc_info[2]
# TODO: Can this be done as a decorator? Implement as needed.
def RunWithLocks(fn, locks, timeout, block, *args, **kwargs):
""" Runs the given function, acquiring a set of locks beforehand.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment