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)
 |