Make sure to unpause all elements when resuming

The indegree code added a regression because elements with an indegree
would not be unpaused! This is now corrected. Time to add more tests :)
This commit is contained in:
James Shubin
2016-01-19 22:01:51 -05:00
parent 9c18972af4
commit 8308680a50
6 changed files with 30 additions and 25 deletions

View File

@@ -255,22 +255,22 @@ func (obj *BaseType) SendEvent(event eventName, sync bool, activity bool) bool {
}
}
// process events when a select gets one
// this handles the pause code too!
func (obj *BaseType) ReadEvent(event *Event) bool {
// process events when a select gets one, this handles the pause code too!
// the return values specify if we should exit and poke respectively
func (obj *BaseType) ReadEvent(event *Event) (exit, poke bool) {
event.ACK()
switch event.Name {
case eventStart:
return true
return false, true
case eventPoke:
return true
return false, true
case eventBackPoke:
return true
return false, true // forward poking in response to a back poke!
case eventExit:
return false
return true, false
case eventPause:
// wait for next event to continue
@@ -278,18 +278,19 @@ func (obj *BaseType) ReadEvent(event *Event) bool {
case e := <-obj.events:
e.ACK()
if e.Name == eventExit {
return false
return true, false
} else if e.Name == eventStart { // eventContinue
return true
return false, false // don't poke on unpause!
} else {
log.Fatal("Unknown event: ", e)
// if we get a poke event here, it's a bug!
log.Fatalf("%v[%v]: Unknown event: %v, while paused!", obj.GetType(), obj.GetName(), e)
}
}
default:
log.Fatal("Unknown event: ", event)
}
return false // required to keep the stupid go compiler happy
return true, false // required to keep the stupid go compiler happy
}
// useful for using as: return CleanState() in the StateOK functions when there
@@ -355,16 +356,16 @@ func (obj *NoopType) Watch() {
//vertex := obj.vertex // stored with SetVertex
var send = false // send event?
var exit = false
for {
obj.SetState(typeWatching) // reset
select {
case event := <-obj.events:
obj.SetConvergedState(typeConvergedNil)
if ok := obj.ReadEvent(&event); !ok {
// we avoid sending events on unpause
if exit, send = obj.ReadEvent(&event); exit {
return // exit
}
// XXX: should we avoid sending events on UNPAUSE ?
send = true
case _ = <-TimeAfterOrBlock(obj.ctimeout):
obj.SetConvergedState(typeConvergedTimeout)