import SimPy.Simulation as Sim from SimPy.Lister import * put=9999 get=666 def putfunc(a): a[0][2]._put(a) def getfunc(a): a[0][2]._get(a) class Bin(Lister): "Bounded buffer" def __init__(self,capacity=0,initialAvail=0,name="a_bin"): self.name=name self.inBin=initialAvail self.waitQput=[] self.waitQget=[] self.capacity=capacity def _put(self,par): "Put in buffer (blocking)" menge=par[0][3] if menge+self.inBin<= self.capacity: self.inBin+=menge if self.waitQget: for qd in self.waitQget: if qd[1]<=self.inBin: Sim.reactivate(qd[0],delay=0,prior=True) self.inBin-=qd[1] self.waitQget.remove(qd) else: break who=par[1] Sim._e._post(who,at=Sim._t) else: #wait for bin space self.waitQput.append((par[0][1],menge)) par[0][1]._nextTime=None def _get(self,par): "Get from buffer (blocking)" menge=par[0][3] if menge>self.inBin: #queue here process menge (==requirement) self.waitQget.append((par[0][1],menge)) par[0][1]._nextTime=None else : self.inBin-=menge who=par[1] # look for processes waiting for bin space if self.waitQput: for qd in self.waitQput: if qd[1]<=(self.capacity-self.inBin): Sim.reactivate(qd[0],delay=0,prior=True) self.inBin+=qd[1] self.waitQput.remove(qd) else: break Sim._e._post(who,at=Sim._t) def simulate(until=0): Sim._stop=False if Sim._e == None: raise Sim.Simerror("Fatal SimPy error: Simulation not initialized") if Sim._e.events == {}: message="SimPy: No activities scheduled" return message Sim._endtime=until message="SimPy: Normal exit" dispatch={Sim.hold:Sim.holdfunc,Sim.request:Sim.requestfunc,Sim.release:Sim.releasefunc, Sim.passivate:Sim.passivatefunc,put:putfunc,get:getfunc} commandcodes=dispatch.keys() commandwords={Sim.hold:"hold",Sim.request:"request",Sim.release:"release",Sim.passivate:"passivate", Sim.waitevent:"waitevent",Sim.queueevent:"queueevent",Sim.waituntil:"waituntil", put:"put",get:"get"} while not Sim._stop and Sim._t<=Sim._endtime: try: a=Sim._e._nextev() if not a[0]==None: command = a[0][0] dispatch[command](a) except Sim.Simerror, error: message="SimPy: "+error.value Sim._stop = True Sim._e=None return message