Commit e677d5e8 authored by Hrvoje Ribicic's avatar Hrvoje Ribicic

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 <riba@google.com>
Reviewed-by: default avatarPetr Pudlak <pudlak@google.com>
parent fbab1c76
......@@ -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.
"""
threading.Thread.__init__(self)
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
try:
self._fn(*self._args, **self._kwargs)
except:
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