lock s.kill, send done signal

This commit is contained in:
Barak Michener 2014-08-16 18:03:05 -04:00
parent f605e1138d
commit c1ff6ce1aa

View file

@ -93,8 +93,11 @@ func (s *Session) SendResult(r *Result) bool {
if s.limit >= 0 && s.limit == s.count { if s.limit >= 0 && s.limit == s.count {
return false return false
} }
s.envLock.Lock()
kill := s.kill
s.envLock.Unlock()
select { select {
case <-s.kill: case <-kill:
return false return false
default: default:
} }
@ -125,28 +128,40 @@ func (s *Session) runUnsafe(input interface{}) (otto.Value, error) {
s.env.Interrupt = make(chan func(), 1) s.env.Interrupt = make(chan func(), 1)
ready := make(chan struct{}) ready := make(chan struct{})
s.kill = make(chan struct{}) done := make(chan struct{})
if s.timeout >= 0 { if s.timeout >= 0 {
go func() { go func() {
time.Sleep(s.timeout) time.Sleep(s.timeout)
<-ready <-ready
select {
case <-done:
return
default:
close(s.kill) close(s.kill)
s.envLock.Lock() s.envLock.Lock()
defer s.envLock.Unlock() defer s.envLock.Unlock()
s.kill = nil
if s.env != nil { if s.env != nil {
s.env.Interrupt <- func() { s.env.Interrupt <- func() {
panic(ErrKillTimeout) panic(ErrKillTimeout)
} }
s.env = s.emptyEnv s.env = s.emptyEnv
} }
return
}
}() }()
} }
s.envLock.Lock() s.envLock.Lock()
env := s.env env := s.env
if s.kill == nil {
s.kill = make(chan struct{})
}
s.envLock.Unlock() s.envLock.Unlock()
close(ready) close(ready)
return env.Run(input) out, err := env.Run(input)
close(done)
return out, err
} }
func (s *Session) ExecInput(input string, out chan interface{}, limit int) { func (s *Session) ExecInput(input string, out chan interface{}, limit int) {
@ -257,8 +272,11 @@ func (s *Session) GetJson() ([]interface{}, error) {
if s.err != nil { if s.err != nil {
return nil, s.err return nil, s.err
} }
s.envLock.Lock()
kill := s.kill
s.envLock.Unlock()
select { select {
case <-s.kill: case <-kill:
return nil, ErrKillTimeout return nil, ErrKillTimeout
default: default:
return s.dataOutput, nil return s.dataOutput, nil