[PATCH 1/2] Add error reporting to threadMgr
Brian C. Lane
bcl at redhat.com
Thu Jan 24 23:21:08 UTC 2013
From: "Brian C. Lane" <bcl at redhat.com>
We need to be able to tell when a thread has quit because of an error.
This adds the ability to save thread traceback information in threadMgr
and a new method, .wait() that can be used instead of join. It will
raise an error if the thread quits because of an Exception.
---
pyanaconda/threads.py | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/pyanaconda/threads.py b/pyanaconda/threads.py
index 55fe141..6eca96b 100644
--- a/pyanaconda/threads.py
+++ b/pyanaconda/threads.py
@@ -35,6 +35,7 @@ class ThreadManager(object):
"""
def __init__(self):
self._objs = {}
+ self._errors = {}
def __call__(self):
return self
@@ -47,6 +48,7 @@ class ThreadManager(object):
raise KeyError
self._objs[obj.name] = obj
+ self._errors[obj.name] = None
obj.start()
def remove(self, name):
@@ -66,6 +68,32 @@ class ThreadManager(object):
"""
return self._objs.get(name)
+ def wait(self, name):
+ """Wait for the thread to exit and if the thread exited with an error
+ re-raise it here.
+ """
+ if self.exists(name):
+ self.get(name).join()
+ if self._errors.get(name) is not None:
+ raise self._errors[name][0], self._errors[name][1], self._errors[name][2]
+
+ def set_error(self, name, *exc_info):
+ """Set the error data for a thread
+
+ The exception data is expected to be the tuple from sys.exc_info()
+ """
+ self._errors[name] = exc_info
+
+ def get_error(self, name):
+ """Get the error data for a thread using its name
+ """
+ return self._errors.get(name)
+
+ def any_errors(self):
+ """Return True of there have been any errors in any threads
+ """
+ return any(self._errors.values())
+
class AnacondaThread(threading.Thread):
"""A threading.Thread subclass that exists only for a couple purposes:
@@ -93,6 +121,7 @@ class AnacondaThread(threading.Thread):
raise
except:
sys.excepthook(*sys.exc_info())
+ threadMgr.set_error(self.name, *sys.exc_info())
finally:
threadMgr.remove(self.name)
log.info("Thread Done: %s (%s)" % (self.name, self.ident))
--
1.8.0.2
More information about the anaconda-patches
mailing list