// Copyright 2015 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 "components/scheduler/base/real_time_domain.h"

#include "base/bind.h"
#include "components/scheduler/base/task_queue_impl.h"
#include "components/scheduler/base/task_queue_manager_delegate.h"

namespace scheduler {

RealTimeDomain::RealTimeDomain() : weak_factory_(this) {}

RealTimeDomain::~RealTimeDomain() {}

void RealTimeDomain::OnRegisterWithTaskQueueManager(
    TaskQueueManagerDelegate* task_queue_manager_delegate,
    base::Closure do_work_closure) {
  task_queue_manager_delegate_ = task_queue_manager_delegate;
  do_work_closure_ = do_work_closure;
  DCHECK(task_queue_manager_delegate_);
}

LazyNow RealTimeDomain::CreateLazyNow() {
  DCHECK(task_queue_manager_delegate_);
  return LazyNow(task_queue_manager_delegate_);
}

void RealTimeDomain::RequestWakeup(LazyNow* lazy_now, base::TimeDelta delay) {
  PostWrappedDoWork(lazy_now->Now(), lazy_now->Now() + delay);
}

bool RealTimeDomain::MaybeAdvanceTime() {
  base::TimeTicks next_run_time;
  if (!NextScheduledRunTime(&next_run_time))
    return false;

  DCHECK(task_queue_manager_delegate_);
  base::TimeTicks now = task_queue_manager_delegate_->NowTicks();
  if (now >= next_run_time)
    return true;

  PostWrappedDoWork(now, next_run_time);
  return false;
}

void RealTimeDomain::PostWrappedDoWork(base::TimeTicks now,
                                       base::TimeTicks run_time) {
  DCHECK_GE(run_time, now);
  DCHECK(task_queue_manager_delegate_);
  if (pending_wakeups_.insert(run_time).second) {
    task_queue_manager_delegate_->PostDelayedTask(
        FROM_HERE,
        base::Bind(&RealTimeDomain::WrappedDoWorkTask,
                   weak_factory_.GetWeakPtr(), run_time),
        run_time - now);
  }
}

void RealTimeDomain::WrappedDoWorkTask(base::TimeTicks run_time) {
  pending_wakeups_.erase(run_time);
  do_work_closure_.Run();
}

void RealTimeDomain::AsValueIntoInternal(
    base::trace_event::TracedValue* state) const {}

const char* RealTimeDomain::GetName() const {
  return "RealTimeDomain";
}

}  // namespace scheduler
