- fix bug send msg to closed channel.

This commit is contained in:
gazebo
2018-09-17 17:49:13 +08:00
parent 35da901319
commit 764bc0b7b3

View File

@@ -98,7 +98,6 @@ func RunTask(taskName string, worker WorkFunc, resultHandler ResultHandlerFunc,
for {
select {
case <-task.quitChan:
chanRetVal = retVal
goto end
case job := <-task.taskChan:
if job == nil {
@@ -113,7 +112,6 @@ func RunTask(taskName string, worker WorkFunc, resultHandler ResultHandlerFunc,
} else {
chanRetVal = err
task.Cancel()
task.setStatus(TaskStatusFailed)
}
}
}
@@ -129,26 +127,41 @@ func RunTask(taskName string, worker WorkFunc, resultHandler ResultHandlerFunc,
task.taskChan <- nil
}
task.result = make([]interface{}, 0)
taskResult := make([]interface{}, 0)
var taskErr error
for i := 0; i < parallelCount; i++ {
result := <-task.subFinishChan
if err2, ok := result.(error); ok {
task.result = nil
task.err = err2
taskResult = nil
taskErr = err2
break
} else {
} else if result != nil {
resultList := result.([]interface{})
task.result = append(task.result, resultList...)
taskResult = append(taskResult, resultList...)
}
}
if task.GetStatus() != TaskStatusFailed {
task.locker.Lock()
if taskErr != nil { // 如果有错误,肯定就是失败了
task.Status = TaskStatusFailed
} else {
if len(task.taskChan) > 0 {
task.err = ErrTaskIsCanceled
task.setStatus(TaskStatusCanceled)
taskErr = ErrTaskIsCanceled
task.Status = TaskStatusCanceled
} else {
task.setStatus(TaskStatusFinished)
task.Status = TaskStatusFinished
}
}
task.err = taskErr
task.result = taskResult
task.TerminatedAt = time.Now()
task.locker.Unlock()
close(task.finishChan)
close(task.subFinishChan)
close(task.quitChan)
if resultHandler != nil {
resultHandler(taskName, task.result, task.err)
}
@@ -167,6 +180,9 @@ func (t *Task) GetResult(duration time.Duration) (retVal []interface{}, err erro
select {
case <-t.finishChan:
timer.Stop()
t.locker.RLock()
defer t.locker.RUnlock()
return t.result, t.err
case <-timer.C:
}
@@ -227,10 +243,4 @@ func (t *Task) setStatus(status int) {
defer t.locker.Unlock()
t.Status = status
if status >= TaskStatusEndBegin {
t.TerminatedAt = time.Now()
close(t.finishChan)
close(t.subFinishChan)
close(t.quitChan)
}
}