basic signalling altered. now succeed() should be provided with the...

basic signalling altered. now succeed() should be provided with the transmitter and the time as arguments
parent 12ebe2f8
...@@ -156,7 +156,8 @@ class Assembly(CoreObject): ...@@ -156,7 +156,8 @@ class Assembly(CoreObject):
# wait until the Queue can accept an entity and one predecessor requests it # wait until the Queue can accept an entity and one predecessor requests it
yield self.isRequested #[self.isRequested,self.canDispose, self.loadOperatorAvailable] yield self.isRequested #[self.isRequested,self.canDispose, self.loadOperatorAvailable]
if self.isRequested.value: if self.isRequested.value:
self.printTrace(self.id, isRequested=self.isRequested.value.id) transmitter, eventTime=self.isRequested.value
self.printTrace(self.id, isRequested=transmitter.id)
# reset the isRequested signal parameter # reset the isRequested signal parameter
self.isRequested=self.env.event() self.isRequested=self.env.event()
...@@ -166,7 +167,8 @@ class Assembly(CoreObject): ...@@ -166,7 +167,8 @@ class Assembly(CoreObject):
self.printTrace(self.id, waitEvent='(to load parts)') self.printTrace(self.id, waitEvent='(to load parts)')
yield self.isRequested yield self.isRequested
if self.isRequested.value: if self.isRequested.value:
self.printTrace(self.id, isRequested=self.isRequested.value.id) transmitter, eventTime=self.isRequested.value
self.printTrace(self.id, isRequested=transmitter.id)
# reset the isRequested signal parameter # reset the isRequested signal parameter
self.isRequested=self.env.event() self.isRequested=self.env.event()
# TODO: fix the getEntity 'Part' case # TODO: fix the getEntity 'Part' case
...@@ -205,14 +207,16 @@ class Assembly(CoreObject): ...@@ -205,14 +207,16 @@ class Assembly(CoreObject):
# if there was interruption # if there was interruption
# TODO not good implementation # TODO not good implementation
if self.interruptionStart in receivedEvent: if self.interruptionStart in receivedEvent:
assert self.interruptionStart.value==self.env.now, 'the interruption has not been processed on the time of activation' transmitter, eventTime=self.interruptionStart.value
assert eventTime==self.env.now, 'the interruption has not been processed on the time of activation'
self.interruptionStart=self.env.event() self.interruptionStart=self.env.event()
# wait for the end of the interruption # wait for the end of the interruption
self.interruptionActions() # execute interruption actions self.interruptionActions() # execute interruption actions
# loop until we reach at a state that there is no interruption # loop until we reach at a state that there is no interruption
while 1: while 1:
yield self.interruptionEnd # interruptionEnd to be triggered by ObjectInterruption yield self.interruptionEnd # interruptionEnd to be triggered by ObjectInterruption
assert self.env.now==self.interruptionEnd.value, 'the victim of the failure is not the object that received it' transmitter, eventTime=self.interruptionEnd.value
assert eventTime==self.env.now, 'the victim of the failure is not the object that received it'
self.interruptionEnd=self.env.event() self.interruptionEnd=self.env.event()
if self.Up and self.onShift: if self.Up and self.onShift:
break break
...@@ -223,10 +227,11 @@ class Assembly(CoreObject): ...@@ -223,10 +227,11 @@ class Assembly(CoreObject):
else: else:
continue continue
if self.canDispose in receivedEvent: if self.canDispose in receivedEvent:
if self.canDispose.value!=self.env.now: transmitter, eventTime=self.canDispose.value
if eventTime!=self.env.now:
self.canDispose=self.env.event() self.canDispose=self.env.event()
continue continue
assert self.canDispose.value==self.env.now,'canDispose signal is late' assert eventTime==self.env.now,'canDispose signal is late'
self.canDispose=self.env.event() self.canDispose=self.env.event()
# try to signal a receiver, if successful then proceed to get an other entity # try to signal a receiver, if successful then proceed to get an other entity
if self.signalReceiver(): if self.signalReceiver():
...@@ -242,8 +247,9 @@ class Assembly(CoreObject): ...@@ -242,8 +247,9 @@ class Assembly(CoreObject):
self.waitEntityRemoval=True self.waitEntityRemoval=True
self.printTrace(self.id, waitEvent='(entityRemoved)') self.printTrace(self.id, waitEvent='(entityRemoved)')
yield self.entityRemoved yield self.entityRemoved
self.printTrace(self.id, entityRemoved=self.entityRemoved.value) transmitter, eventTime=self.entityRemoved.value
assert self.entityRemoved.value==self.env.now,'entityRemoved event activated earlier than received' self.printTrace(self.id, entityRemoved=eventTime)
assert eventTime==self.env.now,'entityRemoved event activated earlier than received'
self.waitEntityRemoval=False self.waitEntityRemoval=False
self.entityRemoved=self.env.event() self.entityRemoved=self.env.event()
# if while waiting (for a canDispose event) became free as the machines that follows emptied it, then proceed # if while waiting (for a canDispose event) became free as the machines that follows emptied it, then proceed
......
...@@ -103,12 +103,14 @@ class Conveyer(CoreObject): ...@@ -103,12 +103,14 @@ class Conveyer(CoreObject):
#set it as the timeToWait of the conveyerMover and raise call=true so that it will be triggered #set it as the timeToWait of the conveyerMover and raise call=true so that it will be triggered
if self.updateMoveTime(): if self.updateMoveTime():
# print self.id, 'time to move', self.conveyerMover.timeToWait # print self.id, 'time to move', self.conveyerMover.timeToWait
self.conveyerMover.canMove.succeed(self.env.now) succeedTuple=(self,self.env.now)
self.conveyerMover.canMove.succeed(succeedTuple)
self.printTrace(self.id, waitEvent='') self.printTrace(self.id, waitEvent='')
receivedEvent=yield self.env.any_of([self.isRequested , self.canDispose , self.moveEnd]) # , self.loadOperatorAvailable] receivedEvent=yield self.env.any_of([self.isRequested , self.canDispose , self.moveEnd]) # , self.loadOperatorAvailable]
# if the event that activated the thread is isRequested then getEntity # if the event that activated the thread is isRequested then getEntity
if self.isRequested in receivedEvent: if self.isRequested in receivedEvent:
transmitter, eventTime=self.isRequested.value
self.printTrace(self.id, isRequested='') self.printTrace(self.id, isRequested='')
# reset the isRequested signal parameter # reset the isRequested signal parameter
self.isRequested=self.env.event() self.isRequested=self.env.event()
...@@ -122,10 +124,12 @@ class Conveyer(CoreObject): ...@@ -122,10 +124,12 @@ class Conveyer(CoreObject):
# self.loadOperatorAvailable.value=None # self.loadOperatorAvailable.value=None
# if the queue received an canDispose with signalparam time, this means that the signals was sent from a MouldAssemblyBuffer # if the queue received an canDispose with signalparam time, this means that the signals was sent from a MouldAssemblyBuffer
if self.canDispose in receivedEvent: if self.canDispose in receivedEvent:
transmitter, eventTime=self.canDispose.value
self.printTrace(self.id, canDispose='') self.printTrace(self.id, canDispose='')
self.canDispose=self.env.event() self.canDispose=self.env.event()
# if the object received a moveEnd signal from the ConveyerMover # if the object received a moveEnd signal from the ConveyerMover
if self.moveEnd in receivedEvent: if self.moveEnd in receivedEvent:
transmitter, eventTime=self.moveEnd.value
self.printTrace(self.id, moveEnd='') self.printTrace(self.id, moveEnd='')
self.moveEnd=self.env.event() self.moveEnd=self.env.event()
# check if there is a possibility to accept and signal a giver # check if there is a possibility to accept and signal a giver
...@@ -359,7 +363,8 @@ class Conveyer(CoreObject): ...@@ -359,7 +363,8 @@ class Conveyer(CoreObject):
#calculate the time that the conveyer will become available again and trigger the conveyerMover #calculate the time that the conveyer will become available again and trigger the conveyerMover
if self.updateMoveTime(): if self.updateMoveTime():
# print self.id, 'time to move', self.conveyerMover.timeToWait # print self.id, 'time to move', self.conveyerMover.timeToWait
self.conveyerMover.canMove.succeed(self.env.now) succeedTuple=(self,self.env.now)
self.conveyerMover.canMove.succeed(succeedTuple)
# if there is anything to dispose of then signal a receiver # if there is anything to dispose of then signal a receiver
if self.haveToDispose(): if self.haveToDispose():
self.printTrace(self.id, attemptSingalReceiver='(removeEntity)') self.printTrace(self.id, attemptSingalReceiver='(removeEntity)')
...@@ -519,13 +524,15 @@ class ConveyerMover(object): ...@@ -519,13 +524,15 @@ class ConveyerMover(object):
while 1: while 1:
self.conveyer.printTrace(self.conveyer.id, waitEvent='(canMove)') self.conveyer.printTrace(self.conveyer.id, waitEvent='(canMove)')
yield self.canMove #wait until the conveyer triggers the mover yield self.canMove #wait until the conveyer triggers the mover
transmitter, eventTime=self.canMove.value
self.canMove=self.env.event() self.canMove=self.env.event()
self.conveyer.printTrace(self.conveyer.id, received='(canMove)') self.conveyer.printTrace(self.conveyer.id, received='(canMove)')
yield self.env.timeout(self.timeToWait) #wait for the time that the conveyer calculated yield self.env.timeout(self.timeToWait) #wait for the time that the conveyer calculated
# continue if interrupted # continue if interrupted
self.conveyer.moveEntities() # move the entities of the conveyer self.conveyer.moveEntities() # move the entities of the conveyer
self.conveyer.moveEnd.succeed(self.env.now) # send a signal to the conveyer that the move has ended succeedTuple=(self,self.env.now)
self.conveyer.moveEnd.succeed(succeedTuple) # send a signal to the conveyer that the move has ended
...@@ -267,11 +267,13 @@ class CoreObject(ManPyObject): ...@@ -267,11 +267,13 @@ class CoreObject(ManPyObject):
# print self.id,'triggered and waiting' # print self.id,'triggered and waiting'
self.entityRemoved=self.env.event() self.entityRemoved=self.env.event()
self.printTrace(self.id, signal='(removedEntity)') self.printTrace(self.id, signal='(removedEntity)')
self.entityRemoved.succeed(self.env.now) succeedTuple=(self,self.env.now)
self.entityRemoved.succeed(succeedTuple)
elif self.waitEntityRemoval: elif self.waitEntityRemoval:
# print self.id,'not triggered and waiting' # print self.id,'not triggered and waiting'
self.printTrace(self.id, signal='(removedEntity)') self.printTrace(self.id, signal='(removedEntity)')
self.entityRemoved.succeed(self.env.now) succeedTuple=(self,self.env.now)
self.entityRemoved.succeed(succeedTuple)
elif not self.waitEntityRemoval: elif not self.waitEntityRemoval:
# print self.id,'not triggered but not waiting' # print self.id,'not triggered but not waiting'
pass pass
...@@ -460,7 +462,8 @@ class CoreObject(ManPyObject): ...@@ -460,7 +462,8 @@ class CoreObject(ManPyObject):
self.printTrace(self.id, signalReceiver=self.receiver.id) self.printTrace(self.id, signalReceiver=self.receiver.id)
# assign the entry of the receiver # assign the entry of the receiver
self.receiver.assignEntryTo() self.receiver.assignEntryTo()
self.receiver.isRequested.succeed(self) succeedTuple=(self,self.env.now)
self.receiver.isRequested.succeed(succeedTuple)
return True return True
# if no receiver can accept then try to preempt a receive if the stations holds a critical order # if no receiver can accept then try to preempt a receive if the stations holds a critical order
self.preemptReceiver() self.preemptReceiver()
...@@ -531,7 +534,8 @@ class CoreObject(ManPyObject): ...@@ -531,7 +534,8 @@ class CoreObject(ManPyObject):
self.giver=giver self.giver=giver
self.giver.receiver=self self.giver.receiver=self
self.printTrace(self.id, signalGiver=self.giver.id) self.printTrace(self.id, signalGiver=self.giver.id)
self.giver.canDispose.succeed(self.env.now) succeedTuple=(self,self.env.now)
self.giver.canDispose.succeed(succeedTuple)
return True return True
return False return False
......
...@@ -280,7 +280,8 @@ def setWIP(entityList): ...@@ -280,7 +280,8 @@ def setWIP(entityList):
if issubclass(entity.currentStation.__class__, Queue): if issubclass(entity.currentStation.__class__, Queue):
# send the signal only if it is not already triggered # send the signal only if it is not already triggered
if not entity.currentStation.canDispose.triggered: if not entity.currentStation.canDispose.triggered:
entity.currentStation.canDispose.succeed(G.env.now) succeedTuple=(G.env,G.env.now)
entity.currentStation.canDispose.succeed(succeedTuple)
# if we are in the start of the simulation the object is of server type then we should send initialWIP signal # if we are in the start of the simulation the object is of server type then we should send initialWIP signal
# TODO, maybe use 'class_family attribute here' # TODO, maybe use 'class_family attribute here'
if G.env.now==0 and entity.currentStation: if G.env.now==0 and entity.currentStation:
...@@ -291,7 +292,8 @@ def setWIP(entityList): ...@@ -291,7 +292,8 @@ def setWIP(entityList):
# trigger initialWIP event only if it has not been triggered. Otherwise # trigger initialWIP event only if it has not been triggered. Otherwise
# if we set more than one entities (e.g. in reassembly) it will crash # if we set more than one entities (e.g. in reassembly) it will crash
if not (entity.currentStation.initialWIP.triggered): if not (entity.currentStation.initialWIP.triggered):
entity.currentStation.initialWIP.succeed(G.env) succeedTuple=(G.env,G.env.now)
entity.currentStation.initialWIP.succeed(succeedTuple)
def countIntervalThroughput(): def countIntervalThroughput():
......
This diff is collapsed.
...@@ -72,7 +72,8 @@ class ObjectInterruption(ManPyObject): ...@@ -72,7 +72,8 @@ class ObjectInterruption(ManPyObject):
# signalling can be done via Machine request/releaseOperator # signalling can be done via Machine request/releaseOperator
# ======================================================================= # =======================================================================
def invoke(self): def invoke(self):
self.isCalled.succeed(self.env.now) succeedTuple=(self.victim,self.env.now)
self.isCalled.succeed(succeedTuple)
#=========================================================================== #===========================================================================
# returns the internal queue of the victim # returns the internal queue of the victim
...@@ -94,7 +95,8 @@ class ObjectInterruption(ManPyObject): ...@@ -94,7 +95,8 @@ class ObjectInterruption(ManPyObject):
# inform the victim by whom will it be interrupted # inform the victim by whom will it be interrupted
# TODO: reconsider what happens when failure and ShiftScheduler (e.g.) signal simultaneously # TODO: reconsider what happens when failure and ShiftScheduler (e.g.) signal simultaneously
self.victim.interruptedBy=self.type self.victim.interruptedBy=self.type
self.victim.interruptionStart.succeed(self.env.now) succeedTuple=(self,self.env.now)
self.victim.interruptionStart.succeed(succeedTuple)
# if the machines are operated by dedicated operators # if the machines are operated by dedicated operators
if self.victim.dedicatedOperator: if self.victim.dedicatedOperator:
# request allocation # request allocation
...@@ -104,7 +106,8 @@ class ObjectInterruption(ManPyObject): ...@@ -104,7 +106,8 @@ class ObjectInterruption(ManPyObject):
# reactivate the victim # reactivate the victim
#=========================================================================== #===========================================================================
def reactivateVictim(self): def reactivateVictim(self):
self.victim.interruptionEnd.succeed(self.env.now) succeedTuple=(self,self.env.now)
self.victim.interruptionEnd.succeed(succeedTuple)
#reset the interruptionStart event of the victim #reset the interruptionStart event of the victim
self.victim.interruptionStart=self.env.event() self.victim.interruptionStart=self.env.event()
# TODO: reconsider what happens when failure and ShiftScheduler (e.g.) signal simultaneously # TODO: reconsider what happens when failure and ShiftScheduler (e.g.) signal simultaneously
......
...@@ -72,7 +72,8 @@ class Broker(ObjectInterruption): ...@@ -72,7 +72,8 @@ class Broker(ObjectInterruption):
while 1: while 1:
# TODO: add new broker event - brokerIsCalled # TODO: add new broker event - brokerIsCalled
yield self.isCalled yield self.isCalled
assert self.isCalled.value==self.env.now, 'the broker should be granted control instantly' transmitter, eventTime=self.isCalled.value
assert eventTime==self.env.now, 'the broker should be granted control instantly'
self.isCalled=self.env.event() self.isCalled=self.env.event()
self.victim.printTrace(self.victim.id, received='(broker)') self.victim.printTrace(self.victim.id, received='(broker)')
# ======= request a resource # ======= request a resource
...@@ -94,11 +95,13 @@ class Broker(ObjectInterruption): ...@@ -94,11 +95,13 @@ class Broker(ObjectInterruption):
if not G.Router.invoked: if not G.Router.invoked:
self.victim.printTrace(self.victim.id, signal='router (broker)') self.victim.printTrace(self.victim.id, signal='router (broker)')
G.Router.invoked=True G.Router.invoked=True
G.Router.isCalled.succeed(self.env.now) succeedTuple=(self,self.env.now)
G.Router.isCalled.succeed(succeedTuple)
self.waitForOperator=True self.waitForOperator=True
self.victim.printTrace(self.victim.id, waitEvent='(resourceIsAvailable broker)') self.victim.printTrace(self.victim.id, waitEvent='(resourceIsAvailable broker)')
yield self.resourceAvailable yield self.resourceAvailable
transmitter, eventTime=self.resourceAvailable.value
self.resourceAvailable=self.env.event() self.resourceAvailable=self.env.event()
# remove the currentEntity from the pendingEntities # remove the currentEntity from the pendingEntities
if self.victim.currentEntity in G.pendingEntities: if self.victim.currentEntity in G.pendingEntities:
...@@ -110,6 +113,7 @@ class Broker(ObjectInterruption): ...@@ -110,6 +113,7 @@ class Broker(ObjectInterruption):
self.waitForOperator=True self.waitForOperator=True
self.victim.printTrace(self.victim.id, waitEvent='(resourceIsAvailable broker)') self.victim.printTrace(self.victim.id, waitEvent='(resourceIsAvailable broker)')
yield self.resourceAvailable yield self.resourceAvailable
transmitter, eventTime=self.resourceAvailable.value
self.resourceAvailable=self.env.event() self.resourceAvailable=self.env.event()
self.waitForOperator=False self.waitForOperator=False
#=============================================================== #===============================================================
...@@ -132,13 +136,15 @@ class Broker(ObjectInterruption): ...@@ -132,13 +136,15 @@ class Broker(ObjectInterruption):
self.victim.outputTrace(self.victim.currentOperator.objName, "started work in "+ self.victim.objName) self.victim.outputTrace(self.victim.currentOperator.objName, "started work in "+ self.victim.objName)
self.victim.currentOperator.timeLastOperationStarted=self.env.now#() self.victim.currentOperator.timeLastOperationStarted=self.env.now#()
# signal the machine that an operator is reserved # signal the machine that an operator is reserved
self.victim.brokerIsSet.succeed(self.env.now) succeedTuple=(self,self.env.now)
self.victim.brokerIsSet.succeed(succeedTuple)
# update the schedule of the operator # update the schedule of the operator
self.victim.currentOperator.schedule.append([self.victim, self.env.now]) self.victim.currentOperator.schedule.append([self.victim, self.env.now])
# wait till the processing is over # wait till the processing is over
yield self.isCalled yield self.isCalled
assert self.isCalled.value==self.env.now, 'the broker should be granted control instantly' transmitter, eventTime=self.isCalled.value
assert eventTime==self.env.now, 'the broker should be granted control instantly'
self.isCalled=self.env.event() self.isCalled=self.env.event()
# The operator is released (the router is not called in the case of skilled ops that work constantly on the same machine) # The operator is released (the router is not called in the case of skilled ops that work constantly on the same machine)
...@@ -153,7 +159,8 @@ class Broker(ObjectInterruption): ...@@ -153,7 +159,8 @@ class Broker(ObjectInterruption):
if not self.victim.router.invoked: if not self.victim.router.invoked:
self.victim.printTrace(self.victim.id, signal='router (broker)') self.victim.printTrace(self.victim.id, signal='router (broker)')
self.victim.router.invoked=True self.victim.router.invoked=True
self.victim.router.isCalled.succeed(self.env.now) succeedTuple=(self,self.env.now)
self.victim.router.isCalled.succeed(succeedTuple)
# TODO: signalling the router will give the chance to it to take the control, but when will it eventually receive it. # TODO: signalling the router will give the chance to it to take the control, but when will it eventually receive it.
# after signalling the broker will signal it's victim that it has finished it's processes # after signalling the broker will signal it's victim that it has finished it's processes
# TODO: this wont work for the moment. The actions that follow must be performed by all operated brokers. # TODO: this wont work for the moment. The actions that follow must be performed by all operated brokers.
...@@ -168,5 +175,6 @@ class Broker(ObjectInterruption): ...@@ -168,5 +175,6 @@ class Broker(ObjectInterruption):
else: else:
pass pass
# return the control to the victim # return the control to the victim
self.victim.brokerIsSet.succeed(self.env.now) succeedTuple=(self,self.env.now)
self.victim.brokerIsSet.succeed(succeedTuple)
...@@ -107,6 +107,7 @@ class Router(ObjectInterruption): ...@@ -107,6 +107,7 @@ class Router(ObjectInterruption):
while 1: while 1:
# wait until the router is called # wait until the router is called
yield self.isCalled yield self.isCalled
transmitter, eventTime=self.isCalled.value
self.isCalled=self.env.event() self.isCalled=self.env.event()
self.printTrace('','=-'*15) self.printTrace('','=-'*15)
self.printTrace('','router received event') self.printTrace('','router received event')
...@@ -238,13 +239,15 @@ class Router(ObjectInterruption): ...@@ -238,13 +239,15 @@ class Router(ObjectInterruption):
elif station.broker.waitForOperator: elif station.broker.waitForOperator:
# signal this station's broker that the resource is available # signal this station's broker that the resource is available
self.printTrace('router', 'signalling broker of'+' '*50+operator.isAssignedTo().id) self.printTrace('router', 'signalling broker of'+' '*50+operator.isAssignedTo().id)
station.broker.resourceAvailable.succeed(self.env.now) succeedTuple=(self,self.env.now)
station.broker.resourceAvailable.succeed(succeedTuple)
else: else:
# signal the queue proceeding the station # signal the queue proceeding the station
if station.canAccept()\ if station.canAccept()\
and any(type=='Load' for type in station.multOperationTypeList): and any(type=='Load' for type in station.multOperationTypeList):
self.printTrace('router', 'signalling'+' '*50+operator.isAssignedTo().id) self.printTrace('router', 'signalling'+' '*50+operator.isAssignedTo().id)
station.loadOperatorAvailable.succeed(self.env.now) succeedTuple=(self,self.env.now)
station.loadOperatorAvailable.succeed(succeedTuple)
#=========================================================================== #===========================================================================
# clear the pending lists of the router # clear the pending lists of the router
......
...@@ -102,7 +102,8 @@ class Queue(CoreObject): ...@@ -102,7 +102,8 @@ class Queue(CoreObject):
self.printTrace(self.id, received='') self.printTrace(self.id, received='')
# if the event that activated the thread is isRequested then getEntity # if the event that activated the thread is isRequested then getEntity
if self.isRequested in receivedEvent: if self.isRequested in receivedEvent:
self.printTrace(self.id, isRequested=self.isRequested.value.id) transmitter, eventTime=self.isRequested.value
self.printTrace(self.id, isRequested=transmitter.id)
# reset the isRequested signal parameter # reset the isRequested signal parameter
self.isRequested=self.env.event() self.isRequested=self.env.event()
self.getEntity() self.getEntity()
...@@ -111,10 +112,11 @@ class Queue(CoreObject): ...@@ -111,10 +112,11 @@ class Queue(CoreObject):
activeObjectQueue[0].startTime=self.env.now activeObjectQueue[0].startTime=self.env.now
# if the queue received an loadOperatorIsAvailable (from Router) with signalparam time # if the queue received an loadOperatorIsAvailable (from Router) with signalparam time
if self.loadOperatorAvailable: if self.loadOperatorAvailable:
# self.printTrace(self.id, loadOperatorAvailable=str(self.loadOperatorAvailable.signalparam)) # transmitter, eventTime=self.loadOperatorAvailable.value
self.loadOperatorAvailable=self.env.event() self.loadOperatorAvailable=self.env.event()
# if the queue received an canDispose with signalparam time, this means that the signals was sent from a MouldAssemblyBuffer # if the queue received an canDispose with signalparam time, this means that the signals was sent from a MouldAssemblyBuffer
if self.canDispose in receivedEvent: if self.canDispose in receivedEvent:
transmitter, eventTime=self.canDispose.value
self.printTrace(self.id, canDispose='') self.printTrace(self.id, canDispose='')
self.canDispose=self.env.event() self.canDispose=self.env.event()
# if the event that activated the thread is canDispose then signalReceiver # if the event that activated the thread is canDispose then signalReceiver
......
...@@ -62,8 +62,9 @@ class EntityGenerator(object): ...@@ -62,8 +62,9 @@ class EntityGenerator(object):
self.victim.getActiveObjectQueue().append(entity) # append the entity to the resource self.victim.getActiveObjectQueue().append(entity) # append the entity to the resource
self.victim.numberOfArrivals+=1 # we have one new arrival self.victim.numberOfArrivals+=1 # we have one new arrival
G.numberOfEntities+=1 G.numberOfEntities+=1
self.victim.appendEntity(entity) self.victim.appendEntity(entity)
self.victim.entityCreated.succeed(entity) succeedTupple=(entity,self.env.now)
self.victim.entityCreated.succeed(succeedTupple)
# else put it on the time list for scheduled Entities # else put it on the time list for scheduled Entities
else: else:
entityCounter=G.numberOfEntities+len(self.victim.scheduledEntities) # this is used just ot output the trace correctly entityCounter=G.numberOfEntities+len(self.victim.scheduledEntities) # this is used just ot output the trace correctly
...@@ -138,11 +139,16 @@ class Source(CoreObject): ...@@ -138,11 +139,16 @@ class Source(CoreObject):
self.printTrace(self.id, received='') self.printTrace(self.id, received='')
# if an entity is created try to signal the receiver and continue # if an entity is created try to signal the receiver and continue
if self.entityCreated in receivedEvent: if self.entityCreated in receivedEvent:
transmitter, eventTime=self.entityCreated.value
self.entityCreated=self.env.event() self.entityCreated=self.env.event()
# otherwise, if the receiver requests availability then try to signal him if there is anything to dispose of # otherwise, if the receiver requests availability then try to signal him if there is anything to dispose of
if self.canDispose in receivedEvent or self.loadOperatorAvailable in receivedEvent: if self.canDispose in receivedEvent or self.loadOperatorAvailable in receivedEvent:
self.canDispose=self.env.event() if self.canDispose in receivedEvent:
self.loadOperatorAvailable=self.env.event() transmitter, eventTime=self.canDispose.value
self.canDispose=self.env.event()
if self.loadOperatorAvailable in receivedEvent:
transmitter, eventTime=self.loadOperatorAvailable.value
self.loadOperatorAvailable=self.env.event()
if self.haveToDispose(): if self.haveToDispose():
if self.signalReceiver(): if self.signalReceiver():
continue continue
...@@ -192,5 +198,6 @@ class Source(CoreObject): ...@@ -192,5 +198,6 @@ class Source(CoreObject):
self.appendEntity(newEntity) self.appendEntity(newEntity)
activeEntity=CoreObject.removeEntity(self, entity) # run the default method activeEntity=CoreObject.removeEntity(self, entity) # run the default method
if len(self.getActiveObjectQueue())==1: if len(self.getActiveObjectQueue())==1:
self.entityCreated.succeed(newEntity) succeedTuple=(newEntity,self.env.now)
self.entityCreated.succeed(succeedTuple)
return activeEntity return activeEntity
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment