Avoid panic's when referencing non-existing objects

No idea why wrapping the cmd in a function avoids a panic. Probably
something about the gc...
This commit is contained in:
James Shubin
2016-01-14 23:58:49 -05:00
parent f7858b8e9b
commit 6e9439f4e3
3 changed files with 29 additions and 6 deletions

15
examples/graph8d.yaml Normal file
View File

@@ -0,0 +1,15 @@
---
graph: mygraph
types:
exec:
- name: exec1
cmd: echo hello from exec1
shell: ''
timeout: 0
watchcmd: sleep 5s
watchshell: ''
ifcmd: ''
ifshell: ''
pollint: 0
state: present
edges: []

View File

@@ -133,7 +133,11 @@ func (obj *ExecType) Watch() {
scanner := bufio.NewScanner(cmdReader) scanner := bufio.NewScanner(cmdReader)
defer cmd.Wait() // XXX: is this necessary? defer cmd.Wait() // XXX: is this necessary?
defer cmd.Process.Kill() // TODO: is this necessary? defer func() {
// FIXME: without wrapping this in this func it panic's
// when running examples/graph8d.yaml
cmd.Process.Kill() // TODO: is this necessary?
}()
if err := cmd.Start(); err != nil { if err := cmd.Start(); err != nil {
log.Printf("%v[%v]: Error starting Cmd: %v", obj.GetType(), obj.GetName(), err) log.Printf("%v[%v]: Error starting Cmd: %v", obj.GetType(), obj.GetName(), err)
log.Fatal(err) // XXX: how should we handle errors? log.Fatal(err) // XXX: how should we handle errors?

View File

@@ -52,7 +52,7 @@ type Type interface {
SetVertex(*Vertex) SetVertex(*Vertex)
SetConvegedCallback(ctimeout int, converged chan bool) SetConvegedCallback(ctimeout int, converged chan bool)
Compare(Type) bool Compare(Type) bool
SendEvent(eventName, bool, bool) SendEvent(eventName, bool, bool) bool
IsWatching() bool IsWatching() bool
SetWatching(bool) SetWatching(bool)
GetConvergedState() typeConvergedState GetConvergedState() typeConvergedState
@@ -234,10 +234,14 @@ func (obj *BaseType) BackPoke() {
} }
// push an event into the message queue for a particular type vertex // push an event into the message queue for a particular type vertex
func (obj *BaseType) SendEvent(event eventName, sync bool, activity bool) { func (obj *BaseType) SendEvent(event eventName, sync bool, activity bool) bool {
// TODO: isn't this race-y ?
if !obj.IsWatching() { // element has already exited
return false // if we don't return, we'll block on the send
}
if !sync { if !sync {
obj.events <- Event{event, nil, "", activity} obj.events <- Event{event, nil, "", activity}
return return true
} }
resp := make(chan bool) resp := make(chan bool)
@@ -246,7 +250,7 @@ func (obj *BaseType) SendEvent(event eventName, sync bool, activity bool) {
value := <-resp value := <-resp
// wait until true value // wait until true value
if value { if value {
return return true
} }
} }
} }