code: func (mtask *managedTask) waitForHostResources() {
  	if mtask.StartSequenceNumber == 0 {
  		// This is the first transition on this host. No need to wait
  		return
  	}
  	if mtask.GetDesiredStatus().Terminal() {
  		// Task's desired status is STOPPED. No need to wait in this case either
  		return
  	}
  
  	seelog.Infof("Managed task [%s]: waiting for any previous stops to complete. Sequence number: %d",
  		mtask.Arn, mtask.StartSequenceNumber)
  
  	othersStoppedCtx, cancel := context.WithCancel(mtask.ctx)
  	defer cancel()
  
  	go func() {
  		mtask.taskStopWG.Wait(mtask.StartSequenceNumber)
  		cancel()
  	}()
  
  	for !mtask.waitEvent(othersStoppedCtx.Done()) {
  		if mtask.GetDesiredStatus().Terminal() {
  			// If we end up here, that means we received a start then stop for this
  			// task before a task that was expected to stop before it could
  			// actually stop
  			break
  		}
  	}
  	seelog.Infof("Managed task [%s]: wait over; ready to move towards status: %s",
  		mtask.Arn, mtask.GetDesiredStatus().String())
  }
docs: // waitForHostResources waits for host resources to become available to start
  // the task. This involves waiting for previous stops to complete so the
  // resources become free.