summaryrefslogtreecommitdiffstats
path: root/tools/gdb/python/threads.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gdb/python/threads.py')
-rw-r--r--tools/gdb/python/threads.py57
1 files changed, 43 insertions, 14 deletions
diff --git a/tools/gdb/python/threads.py b/tools/gdb/python/threads.py
index 1719187..690f77f 100644
--- a/tools/gdb/python/threads.py
+++ b/tools/gdb/python/threads.py
@@ -1,5 +1,5 @@
# RTEMS Tools Project (http://www.rtems.org/)
-# Copyright 2010-2014 Chris Johns (chrisj@rtems.org)
+# Copyright 2010-2015 Chris Johns (chrisj@rtems.org)
# All rights reserved.
#
# This file is part of the RTEMS Tools package in 'rtems-tools'.
@@ -36,13 +36,25 @@ import gdb
import chains
import objects
import percpu
+import rbtrees
+import time
def task_chain(chain):
tasks = []
- node = chain.first()
+ if not chain.empty():
+ node = chain.first()
+ while not node.null():
+ t = control(node.cast('Thread_Control'))
+ tasks.append(t)
+ node = node(node.next())
+ return tasks
+
+def task_tree(tree):
+ tasks = []
+ node = tree.first(rbtrees.rbt_left)
while not node.null():
tasks.append(control(node.cast('Thread_Control')))
- node.next()
+ node = node.next(rbtrees.rbt_left)
return tasks
class state():
@@ -128,6 +140,17 @@ class state():
s = self.masks[m] + ','
return s[:-1]
+class cpu_usage():
+
+ def __init__(self, time_):
+ self.time = time.time(time_)
+
+ def __str__(self):
+ return self.time.tostring()
+
+ def get(self):
+ return self.time.get()
+
class wait_info():
def __init__(self, info):
@@ -165,7 +188,6 @@ class registers():
return float(self.regs[reg])
return int(self.regs[reg])
-
def format(self, reg):
t = self.regs[reg].type
if t in ['uint32_t', 'unsigned', 'unsigned long']:
@@ -208,8 +230,12 @@ class control():
'''
def __init__(self, ctrl):
- self.reference = ctrl
- self.ctrl = ctrl.dereference()
+ if ctrl.type.code == gdb.TYPE_CODE_PTR:
+ self.reference = ctrl
+ self.ctrl = ctrl.dereference()
+ else:
+ self.ctrl = ctrl
+ self.reference = ctrl.address
self.object = objects.control(ctrl['Object'])
self._executing = percpu.thread_active(self.reference)
self._heir = percpu.thread_heir(self.reference)
@@ -245,7 +271,7 @@ class control():
return self.ctrl['cpu_time_budget']
def cpu_time_used(self):
- return self.ctrl['cpu_time_used']
+ return cpu_usage(self.ctrl['cpu_time_used'])
def preemptible(self):
return self.ctrl['is_preemptible']
@@ -259,6 +285,9 @@ class control():
def registers(self):
return registers(self.ctrl['Registers'])
+ def is_idle(self):
+ return (self.id() & 0xff000000) == 0x90000000
+
def brief(self):
return "'%s' (c:%d, r:%d)" % \
(self.name(), self.current_priority(), self.real_priority())
@@ -266,10 +295,13 @@ class control():
class queue():
"""Manage the Thread_queue_Control."""
- priority_headers = 4
-
def __init__(self, que):
- self.que = que
+ if que.type.code == gdb.TYPE_CODE_PTR:
+ self.reference = que
+ self.que = que.dereference()
+ else:
+ self.que = que
+ self.reference = que.address
def fifo(self):
return str(self.que['discipline']) == 'THREAD_QUEUE_DISCIPLINE_FIFO'
@@ -284,8 +316,5 @@ class queue():
if self.fifo():
t = task_chain(chains.control(self.que['Queues']['Fifo']))
else:
- t = []
- for ph in range(0, self.priority_headers):
- t.extend(task_chain(chains.control( \
- self.que['Queues']['Priority'][ph])))
+ t = task_tree(rbtrees.control(self.que['Queues']['Priority']))
return t