diff --git a/toolbox/task.go b/toolbox/task.go index 7e841e89..d1343023 100644 --- a/toolbox/task.go +++ b/toolbox/task.go @@ -20,6 +20,7 @@ import ( "sort" "strconv" "strings" + "sync" "time" ) @@ -32,6 +33,7 @@ type bounds struct { // The bounds for each field. var ( AdminTaskList map[string]Tasker + taskLock sync.Mutex stop chan bool changed chan bool isstart bool @@ -389,6 +391,8 @@ func dayMatches(s *Schedule, t time.Time) bool { // StartTask start all tasks func StartTask() { + taskLock.Lock() + defer taskLock.Unlock() if isstart { //If already started, no need to start another goroutine. return @@ -440,6 +444,8 @@ func run() { // StopTask stop all tasks func StopTask() { + taskLock.Lock() + defer taskLock.Unlock() if isstart { isstart = false stop <- true @@ -449,6 +455,8 @@ func StopTask() { // AddTask add task with name func AddTask(taskname string, t Tasker) { + taskLock.Lock() + defer taskLock.Unlock() t.SetNext(time.Now().Local()) AdminTaskList[taskname] = t if isstart { @@ -458,6 +466,8 @@ func AddTask(taskname string, t Tasker) { // DeleteTask delete task with name func DeleteTask(taskname string) { + taskLock.Lock() + defer taskLock.Unlock() delete(AdminTaskList, taskname) if isstart { changed <- true