Browse Source

fix memory leak caused by time.Timer

pull/169/head
aler9 5 years ago
parent
commit
08823ddc92
  1. 45
      externalcmd/externalcmd.go
  2. 28
      sourcertmp/source.go
  3. 27
      sourcertsp/source.go

45
externalcmd/externalcmd.go

@ -46,35 +46,34 @@ func (e *ExternalCmd) run() { @@ -46,35 +46,34 @@ func (e *ExternalCmd) run() {
defer close(e.done)
for {
if !e.runInner() {
ok := func() bool {
ok := e.runInner()
if !ok {
return false
}
if !e.restart {
<-e.terminate
return false
}
t := time.NewTimer(restartPause)
defer t.Stop()
select {
case <-t.C:
return true
case <-e.terminate:
return false
}
}()
if !ok {
break
}
}
}
func (e *ExternalCmd) runInner() bool {
ok := e.runInnerInner()
if !ok {
return false
}
if !e.restart {
<-e.terminate
return false
}
t := time.NewTimer(restartPause)
defer t.Stop()
select {
case <-t.C:
return true
case <-e.terminate:
return false
}
}
func (e *ExternalCmd) runInnerInner() bool {
var cmd *exec.Cmd
if runtime.GOOS == "windows" {
// on Windows the shell is not used and command is started directly

28
sourcertmp/source.go

@ -123,20 +123,25 @@ outer: @@ -123,20 +123,25 @@ outer:
func (s *Source) runInner() {
defer close(s.innerDone)
outer:
for {
ok := s.runInnerInner()
if !ok {
break outer
}
ok := func() bool {
ok := s.runInnerInner()
if !ok {
return false
}
t := time.NewTimer(retryInterval)
defer t.Stop()
t := time.NewTimer(retryInterval)
defer t.Stop()
select {
case <-s.innerTerminate:
break outer
case <-t.C:
select {
case <-t.C:
return true
case <-s.innerTerminate:
return false
}
}()
if !ok {
break
}
}
}
@ -209,6 +214,7 @@ func (s *Source) runInnerInner() bool { @@ -209,6 +214,7 @@ func (s *Source) runInnerInner() bool {
}()
timer := time.NewTimer(5 * time.Second)
defer timer.Stop()
select {
case <-confDone:

27
sourcertsp/source.go

@ -127,20 +127,25 @@ outer: @@ -127,20 +127,25 @@ outer:
func (s *Source) runInner() {
defer close(s.innerDone)
outer:
for {
ok := s.runInnerInner()
if !ok {
break outer
}
ok := func() bool {
ok := s.runInnerInner()
if !ok {
return false
}
t := time.NewTimer(retryInterval)
defer t.Stop()
t := time.NewTimer(retryInterval)
defer t.Stop()
select {
case <-s.innerTerminate:
break outer
case <-t.C:
select {
case <-t.C:
return true
case <-s.innerTerminate:
return false
}
}()
if !ok {
break
}
}
}

Loading…
Cancel
Save