Exemplo n.º 1
0
class RCB:
    def __init__(self, index):
        self.curPCB = None
        self.waitlist = LinkedList()
        self.index = index

    def Request(self, PCB):
        PCB.AddResource(self)
        if self.Free():
            self.curPCB = PCB
        else:
            self.waitlist.Add(PCB)
            PCB.Block()

    def Release(self):
        self.curPCB.RemoveResource(self.index)
        self.curPCB = self.waitlist.Pop()
        if not self.Free():
            self.curPCB.Unblock()
        return self.curPCB

    def ConditionalRelease(self, PCB):
        if self.curPCB == PCB:
            return self.Release()
        return None

    def TakeOffWaitlist(self, PCB):
        PCB.RemoveResource(self.index)
        self.waitlist.RemoveIndex(PCB.index)

    def Free(self):
        return self.curPCB == None
Exemplo n.º 2
0
class PCB:
    def __init__(self, parent, index, priority):
        self.ready = True
        self.parent = parent
        self.chilren = LinkedList()
        self.resources = LinkedList()
        self.index = index
        self.prio = priority
        if not parent == None:
            parent.AddChild(self)
    
    def Block(self):
        self.ready = False
    
    def Unblock(self):
        self.ready = True
    
    def AddChild(self, child):
        self.chilren.Add(child)

    def AddResource(self, resource):
        self.resources.Add(resource)
    
    def ReleaseResources(self):
        pcbs = []
        for resource in self.resources.GetList():
            pcb = resource.ConditionalRelease(self)
            resource.TakeOffWaitlist(self)
            if not pcb == None:
                pcbs.append(pcb)
        return pcbs

    def RemoveResource(self, index):
        self.resources.RemoveIndex(index)
    
    def Remove(self):
        self.parent.RemoveChild(self.index)

    def RemoveChild(self, index):
        self.chilren.RemoveIndex(index)

    def __str__(self):
        return str(self.index)
    
    def __repr__(self):
        return str(self)