function tcb_run() {
  var packet;
  if (this.state == STATE_SUSPENDED_RUNNABLE) {
    packet = this.queue;
    this.queue = packet.link;
    if (this.queue == null) {
      this.state = STATE_RUNNING;
    } else {
      this.state = STATE_RUNNABLE;
    }
  } else {
    packet = null;
  }
  // Note: This remains a dynamic dispatch call as the task type isn't
  // known statically here.
  return this.task.run(packet);
}
Runs this task, if it is ready to be run, and returns the next task to run.