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

@@ -132,8 +132,12 @@ func (obj *ExecType) Watch() {
}
scanner := bufio.NewScanner(cmdReader)
defer cmd.Wait() // XXX: is this necessary?
defer cmd.Process.Kill() // TODO: is this necessary?
defer cmd.Wait() // XXX: 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 {
log.Printf("%v[%v]: Error starting Cmd: %v", obj.GetType(), obj.GetName(), err)
log.Fatal(err) // XXX: how should we handle errors?

View File

@@ -52,7 +52,7 @@ type Type interface {
SetVertex(*Vertex)
SetConvegedCallback(ctimeout int, converged chan bool)
Compare(Type) bool
SendEvent(eventName, bool, bool)
SendEvent(eventName, bool, bool) bool
IsWatching() bool
SetWatching(bool)
GetConvergedState() typeConvergedState
@@ -234,10 +234,14 @@ func (obj *BaseType) BackPoke() {
}
// 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 {
obj.events <- Event{event, nil, "", activity}
return
return true
}
resp := make(chan bool)
@@ -246,7 +250,7 @@ func (obj *BaseType) SendEvent(event eventName, sync bool, activity bool) {
value := <-resp
// wait until true value
if value {
return
return true
}
}
}