code: func (payloadHandler *payloadRequestHandler) addTasks(payload *ecsacs.PayloadMessage, tasks []*apitask.Task, skipAddTask skipAddTaskComparatorFunc) ([]*ecsacs.IAMRoleCredentialsAckRequest, bool) {
  	allTasksOK := true
  	var credentialsAcks []*ecsacs.IAMRoleCredentialsAckRequest
  	for _, task := range tasks {
  		if skipAddTask(task.GetDesiredStatus()) {
  			continue
  		}
  		payloadHandler.taskEngine.AddTask(task)
  
  		ackCredentials := func(id string, description string) {
  			ack, err := payloadHandler.ackCredentials(payload.MessageId, id)
  			if err != nil {
  				allTasksOK = false
  				seelog.Errorf("Failed to acknowledge %s credentials for task: %s, err: %v", description, task.String(), err)
  				return
  			}
  			credentialsAcks = append(credentialsAcks, ack)
  		}
  
  		// Generate an ack request for the credentials in the task, if the
  		// task is associated with an IAM role or the execution role
  		taskCredentialsID := task.GetCredentialsID()
  		if taskCredentialsID != "" {
  			ackCredentials(taskCredentialsID, "task iam role")
  		}
  
  		taskExecutionCredentialsID := task.GetExecutionCredentialsID()
  		if taskExecutionCredentialsID != "" {
  			ackCredentials(taskExecutionCredentialsID, "task execution role")
  		}
  	}
  	return credentialsAcks, allTasksOK
  }
docs: // addTasks adds the tasks to the task engine based on the skipAddTask condition
  // This is used to add non-stopped tasks before adding stopped tasks