Commit 542f2455 authored by Maria Matejka's avatar Maria Matejka Committed by Maria Matejka
Browse files

GDB: io loop printing support in resource dumps, better iterating over linpool chunks

parent a9efce68
Loading
Loading
Loading
Loading
+34 −18
Original line number Original line Diff line number Diff line
@@ -290,19 +290,26 @@ class BIRDLinPoolResource(BIRDResource):
        self.lptype = gdb.lookup_type("struct linpool")
        self.lptype = gdb.lookup_type("struct linpool")
        self.val = val.cast(self.lptype)
        self.val = val.cast(self.lptype)
        self.info = None
        self.info = None
        self.std = self.ChunkList(self.val["first"])
        self.large = self.ChunkList(self.val["first_large"])


    def count_chunk(self, which):
    class ChunkList:
        cnt = 0
        def __init__(self, val):
        chunk = self.val[which]
            self.val = val
        while str(chunk) != '0x0':

            cnt += 1
        def __iter__(self):
            chunk = self.val
            while str(chunk) != 0x0:
                yield chunk
                chunk = chunk.dereference()["next"]
                chunk = chunk.dereference()["next"]
        return cnt

        def __len__(self):
            return sum([1 for _ in self])


    def parse(self):
    def parse(self):
        self.info = {
        self.info = {
                "std_chunks": self.count_chunk("first"),
                "std_chunks": len(self.std),
                "large_chunks": self.count_chunk("first_large"),
                "large_chunks": len(self.large),
                }
                }


    def memsize(self):
    def memsize(self):
@@ -368,11 +375,25 @@ class BIRDSlabResource(BIRDResource):
                    f", {self.val['objs_per_slab']} objects of size {self.val['obj_size']} per head"
                    f", {self.val['objs_per_slab']} objects of size {self.val['obj_size']} per head"




class BIRDIOLoopResource(BIRDResource):
    def __init__(self, val):
        self.iolooptype = gdb.lookup_type("struct birdloop")
        self.val = val.cast(self.iolooptype)
        self.pages = self.val["pages"]
        self.page_size = gdb.lookup_symbol("page_size")[0].value()

    def memsize(self):
        return BIRDResourceSize(0, self.iolooptype.sizeof, self.pages['cnt'] * self.page_size)

    def __str__(self):
        return f"IO Loop {self.val.address} containing {self.pages['cnt']} free pages (min {self.pages['min']} max {self.pages['max']}), cleanup event {self.pages['cleanup'].dereference().address}: " + \
                ", ".join([ str(p) for p in BIRDList(self.pages["list"])])


class BIRDPoolResource(BIRDResource):
class BIRDPoolResource(BIRDResource):
    def __init__(self, val):
    def __init__(self, val):
        self.pooltype = gdb.lookup_type("struct pool")
        self.pooltype = gdb.lookup_type("struct pool")
        self.resptrtype = gdb.lookup_type("struct resource").pointer()
        self.resptrtype = gdb.lookup_type("struct resource").pointer()
        self.page_size = gdb.lookup_symbol("page_size")[0].value()
        self.val = val.cast(self.pooltype)
        self.val = val.cast(self.pooltype)
        self.inside = BIRDList(self.val["inside"])
        self.inside = BIRDList(self.val["inside"])


@@ -383,14 +404,8 @@ class BIRDPoolResource(BIRDResource):
    def __len__(self):
    def __len__(self):
        return len(self.inside)
        return len(self.inside)


    def free_pages(self):
        if str(self.val['pages']) == '0x0':
            return 0
        else:
            return self.val['pages'].dereference()['free']

    def memsize(self):
    def memsize(self):
        sum = BIRDResourceSize(0, self.pooltype.sizeof, self.free_pages() * self.page_size)
        sum = BIRDResourceSize(0, self.pooltype.sizeof, 0)
#        for i in self.items:
#        for i in self.items:
#            sum += i.memsize()
#            sum += i.memsize()


@@ -400,13 +415,14 @@ class BIRDPoolResource(BIRDResource):
#        for i in self.items:
#        for i in self.items:
#            print(i)
#            print(i)


        return f"Resource pool {self.val.address} \"{self.val['name'].string()}\" containing {len(self)} items and {self.free_pages()} free pages"
        return f"Resource pool {self.val.address} \"{self.val['name'].string()}\" containing {len(self)} items"


BIRDResourceMap = {
BIRDResourceMap = {
        "mbl_memsize": BIRDMBResource,
        "mbl_memsize": BIRDMBResource,
        "pool_memsize": BIRDPoolResource,
        "pool_memsize": BIRDPoolResource,
        "lp_memsize": BIRDLinPoolResource,
        "lp_memsize": BIRDLinPoolResource,
        "slab_memsize": BIRDSlabResource,
        "slab_memsize": BIRDSlabResource,
        "birdloop_memsize": BIRDIOLoopResource,
        }
        }


def BIRDNewResource(res):
def BIRDNewResource(res):