// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/pending_task.h"

#include "base/message_loop/message_loop.h"

namespace base {

PendingTask::PendingTask(const Location& posted_from,
                         OnceClosure task,
                         TimeTicks delayed_run_time,
                         Nestable nestable)
    : task(std::move(task)),
      posted_from(posted_from),
      delayed_run_time(delayed_run_time),
      sequence_num(0),
      nestable(nestable),
      is_high_res(false) {
  const PendingTask* parent_task =
      MessageLoop::current() ? MessageLoop::current()->current_pending_task_
                             : nullptr;
  if (parent_task) {
    task_backtrace[0] = parent_task->posted_from.program_counter();
    std::copy(parent_task->task_backtrace.begin(),
              parent_task->task_backtrace.end() - 1,
              task_backtrace.begin() + 1);
  } else {
    task_backtrace.fill(nullptr);
  }
}

PendingTask::PendingTask(PendingTask&& other) = default;

PendingTask::~PendingTask() = default;

PendingTask& PendingTask::operator=(PendingTask&& other) = default;

bool PendingTask::operator<(const PendingTask& other) const {
  // Since the top of a priority queue is defined as the "greatest" element, we
  // need to invert the comparison here.  We want the smaller time to be at the
  // top of the heap.

  if (delayed_run_time < other.delayed_run_time)
    return false;

  if (delayed_run_time > other.delayed_run_time)
    return true;

  // If the times happen to match, then we use the sequence number to decide.
  // Compare the difference to support integer roll-over.
  return (sequence_num - other.sequence_num) > 0;
}

}  // namespace base
