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:
15
examples/graph8d.yaml
Normal file
15
examples/graph8d.yaml
Normal 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: []
|
||||||
6
exec.go
6
exec.go
@@ -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?
|
||||||
|
|||||||
12
types.go
12
types.go
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user