agent/taskengine/taskfactory.go (67 lines of code) (raw):

package taskengine import ( "errors" "sync" "github.com/aliyun/aliyun_assist_client/agent/log" ) var taskFactory *TaskFactory var lock sync.Mutex type TaskFactory struct { tasks map[string]*Task m sync.Mutex } func GetTaskFactory() *TaskFactory { lock.Lock() defer lock.Unlock() if taskFactory == nil { taskFactory = &TaskFactory{ tasks: make(map[string]*Task), } } return taskFactory } func (t *TaskFactory) AddTask(task *Task) error { return t.AddNamedTask(task.taskInfo.TaskId, task) } func (t *TaskFactory) AddNamedTask(name string, task *Task) error { t.m.Lock() defer t.m.Unlock() if _, ok := t.tasks[name]; ok { log.GetLogger().Error("Add named task failed: duplicated taskId ", name) return errors.New("Task name duplicated") } t.tasks[name] = task return nil } func (t *TaskFactory) GetTask(name string) (*Task, bool) { t.m.Lock() defer t.m.Unlock() task, ok := t.tasks[name] return task, ok } func (t *TaskFactory) RemoveTaskByName(name string) { t.m.Lock() defer t.m.Unlock() delete(t.tasks, name) } func (t *TaskFactory) ContainsTaskByName(name string) bool { t.m.Lock() defer t.m.Unlock() _, ok := t.tasks[name] return ok } // IsAnyTaskRunning returns true when any task exists in TaskFactory, otherwise // false. func (t *TaskFactory) IsAnyTaskRunning() bool { t.m.Lock() defer t.m.Unlock() return len(t.tasks) > 0 } // IsAnyNonPeriodicTaskRunning scans each task registered in TaskFactory which // means "running" and checks whether it is non-periodic task. func (t *TaskFactory) IsAnyNonPeriodicTaskRunning() bool { t.m.Lock() defer t.m.Unlock() for _, task := range t.tasks { // NOTE: Currently we only consider non-periodic tasks if task.taskInfo.Cronat == "" { return true } } return false }