summaryrefslogtreecommitdiff
path: root/lib/taurus/core/util/tb.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/taurus/core/util/tb.py')
-rw-r--r--lib/taurus/core/util/tb.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/lib/taurus/core/util/tb.py b/lib/taurus/core/util/tb.py
new file mode 100644
index 00000000..ff11cc16
--- /dev/null
+++ b/lib/taurus/core/util/tb.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## This file is part of Taurus
+##
+## http://taurus-scada.org
+##
+## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
+##
+## Taurus is free software: you can redistribute it and/or modify
+## it under the terms of the GNU Lesser General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## Taurus is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public License
+## along with Taurus. If not, see <http://www.gnu.org/licenses/>.
+##
+#############################################################################
+
+"""This module contains a set of useful traceback elements based on python's
+:mod:`traceback` system."""
+
+import sys
+import inspect
+import traceback
+import threading
+
+def _get_thread(ident=None):
+ if ident is None:
+ return threading.current_thread()
+ for th in threading.enumerate():
+ if th.ident == ident:
+ return th
+
+def _get_frames():
+ return sys._current_frames()
+
+def format_frame_stacks(frames=None, limit=None):
+ if frames is None:
+ frames = _get_frames()
+ frame_stacks = extract_frame_stacks(frames=frames, limit=limit)
+ ret = []
+
+ for ident, (frame, frame_stack) in frame_stacks.items():
+ curr_th, th = _get_thread(), _get_thread(ident)
+ if th is None:
+ th_name = "<Unknown>"
+ curr = ""
+ else:
+ th_name = th.name
+ if curr_th.ident == th.ident:
+ th_str = "(Current) "
+ else:
+ curr = ""
+ ret.append(" Thread " + curr + th_name + " (" + str(ident) + ") in\n")
+ format_stack = traceback.format_list(frame_stack)
+ for i, line in enumerate(format_stack):
+ line = " " + line.replace("\n ", "\n ")
+ ret.append(line)
+ return ret
+
+def extract_frame_stacks(frames=None, limit=None):
+ if frames is None:
+ frames = _get_frames()
+ ret = {}
+ for ident, frame in frames.items():
+ frame_stack = traceback.extract_stack(frame, limit=limit)
+ ret[ident] = frame, frame_stack
+ return ret
+