85 lines
2.7 KiB
Python
85 lines
2.7 KiB
Python
|
# File: HandleRegistry.py
|
||
|
# Author: Carl Allendorph
|
||
|
# Date: 06NOV2014
|
||
|
#
|
||
|
# Description:
|
||
|
# THis file contains the implementation of a class for accessing the
|
||
|
# handle registry. This contains a mapping of queue handles to
|
||
|
# strings for labeling purposes.
|
||
|
|
||
|
import gdb
|
||
|
from .Types import StdTypes
|
||
|
from .QueueTools import *
|
||
|
|
||
|
|
||
|
class HandleRegistry:
|
||
|
"""The FreeRTOS system can be configured with a table that
|
||
|
associates a name with a QueueHandle_t.
|
||
|
This class can be used to access this table and
|
||
|
label queue/mutex/semaphore/event groups
|
||
|
"""
|
||
|
|
||
|
def __init__(self, regSymbol="xQueueRegistry"):
|
||
|
symbol, methodObj = gdb.lookup_symbol(regSymbol)
|
||
|
self._registry = symbol.value()
|
||
|
self._minIndex = 0
|
||
|
self._maxIndex = 0
|
||
|
self._minIndex, self._maxIndex = self._registry.type.range()
|
||
|
|
||
|
def GetName(self, handle):
|
||
|
"""Find the string name associated with a queue
|
||
|
handle if it exists in the registry
|
||
|
"""
|
||
|
for i in range(self._minIndex, self._maxIndex):
|
||
|
elem = self._registry[i]
|
||
|
h = elem["xHandle"]
|
||
|
val = h.cast(StdTypes.uint32_t)
|
||
|
if handle == val:
|
||
|
print("Found Entry for: %x" % handle)
|
||
|
name = elem["pcQueueName"].string()
|
||
|
return name
|
||
|
|
||
|
def PrintRegistry(self):
|
||
|
for i in range(self._minIndex, self._maxIndex):
|
||
|
elem = self._registry[i]
|
||
|
h = elem["xHandle"]
|
||
|
if h != 0:
|
||
|
name = elem["pcQueueName"].string()
|
||
|
print("%d: %3s %16s" % (i, h, name))
|
||
|
|
||
|
def FilterBy(self, qMode):
|
||
|
|
||
|
"""Retrieve a List of Mutex Queue Handles"""
|
||
|
resp = []
|
||
|
for i in range(self._minIndex, self._maxIndex):
|
||
|
elem = self._registry[i]
|
||
|
h = elem["xHandle"]
|
||
|
if h != 0:
|
||
|
name = elem["pcQueueName"].string()
|
||
|
q = QueueInspector(h)
|
||
|
q.SetName(name)
|
||
|
if qMode != None:
|
||
|
qType = q.GetQueueType()
|
||
|
if qType != None:
|
||
|
if qType == qMode:
|
||
|
resp.append(q)
|
||
|
|
||
|
else:
|
||
|
print("qType == None")
|
||
|
else:
|
||
|
resp.append(q)
|
||
|
|
||
|
return resp
|
||
|
|
||
|
def GetMutexes(self):
|
||
|
"""Retrieve all the Mutex Objects in the Handle Registry"""
|
||
|
return self.FilterBy(QueueMode.MUTEX)
|
||
|
|
||
|
def GetSemaphores(self):
|
||
|
"""Retrieve all the Semaphore Objects in the Handle Registry"""
|
||
|
return self.FilterBy(QueueMode.BINARY)
|
||
|
|
||
|
def GetQueues(self):
|
||
|
"""Retrieve all the Queue Objects in the Handle Registry"""
|
||
|
return self.FilterBy(QueueMode.QUEUE)
|