// Copyright 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 "cc/scheduler/delay_based_time_source.h"

#include <algorithm>
#include <cmath>
#include <string>

#include "base/bind.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/single_thread_task_runner.h"
#include "base/trace_event/trace_event.h"
#include "base/trace_event/trace_event_argument.h"

namespace cc {

namespace {

// kDoubleTickDivisor prevents ticks from running within the specified
// fraction of an interval.  This helps account for jitter in the timebase as
// well as quick timer reactivation.
static const int kDoubleTickDivisor = 2;

// kIntervalChangeThreshold is the fraction of the interval that will trigger an
// immediate interval change.  kPhaseChangeThreshold is the fraction of the
// interval that will trigger an immediate phase change.  If the changes are
// within the thresholds, the change will take place on the next tick.  If
// either change is outside the thresholds, the next tick will be canceled and
// reissued immediately.
static const double kIntervalChangeThreshold = 0.25;
static const double kPhaseChangeThreshold = 0.25;

}  // namespace

// The following methods correspond to the DelayBasedTimeSource that uses
// the base::TimeTicks::Now as the timebase.
scoped_refptr<DelayBasedTimeSourceHighRes> DelayBasedTimeSourceHighRes::Create(
    base::TimeDelta interval,
    base::SingleThreadTaskRunner* task_runner) {
  return make_scoped_refptr(
      new DelayBasedTimeSourceHighRes(interval, task_runner));
}

DelayBasedTimeSourceHighRes::DelayBasedTimeSourceHighRes(
    base::TimeDelta interval,
    base::SingleThreadTaskRunner* task_runner)
    : DelayBasedTimeSource(interval, task_runner) {
}

DelayBasedTimeSourceHighRes::~DelayBasedTimeSourceHighRes() {}

base::TimeTicks DelayBasedTimeSourceHighRes::Now() const {
  return base::TimeTicks::Now();
}

// The following methods correspond to the DelayBasedTimeSource that uses
// the base::TimeTicks::Now as the timebase.
scoped_refptr<DelayBasedTimeSource> DelayBasedTimeSource::Create(
    base::TimeDelta interval,
    base::SingleThreadTaskRunner* task_runner) {
  return make_scoped_refptr(new DelayBasedTimeSource(interval, task_runner));
}

DelayBasedTimeSource::DelayBasedTimeSource(
    base::TimeDelta interval,
    base::SingleThreadTaskRunner* task_runner)
    : client_(NULL),
      last_tick_time_(base::TimeTicks() - interval),
      current_parameters_(interval, base::TimeTicks()),
      next_parameters_(interval, base::TimeTicks()),
      active_(false),
      task_runner_(task_runner),
      weak_factory_(this) {
  DCHECK_GT(interval.ToInternalValue(), 0);
}

DelayBasedTimeSource::~DelayBasedTimeSource() {}

base::TimeTicks DelayBasedTimeSource::SetActive(bool active) {
  TRACE_EVENT1("cc", "DelayBasedTimeSource::SetActive", "active", active);
  if (active == active_)
    return base::TimeTicks();
  active_ = active;

  if (!active_) {
    weak_factory_.InvalidateWeakPtrs();
    return base::TimeTicks();
  }

  PostNextTickTask(Now());

  // Determine if there was a tick that was missed while not active.
  base::TimeTicks last_tick_time_if_always_active =
    current_parameters_.tick_target - current_parameters_.interval;
  base::TimeTicks new_tick_time_threshold =
    last_tick_time_ + current_parameters_.interval / kDoubleTickDivisor;
  if (last_tick_time_if_always_active >  new_tick_time_threshold) {
    last_tick_time_ = last_tick_time_if_always_active;
    return last_tick_time_;
  }

  return base::TimeTicks();
}

bool DelayBasedTimeSource::Active() const { return active_; }

base::TimeTicks DelayBasedTimeSource::LastTickTime() const {
  return last_tick_time_;
}

base::TimeTicks DelayBasedTimeSource::NextTickTime() const {
  return Active() ? current_parameters_.tick_target : base::TimeTicks();
}

void DelayBasedTimeSource::OnTimerFired() {
  DCHECK(active_);

  last_tick_time_ = current_parameters_.tick_target;

  PostNextTickTask(Now());

  // Fire the tick.
  if (client_)
    client_->OnTimerTick();
}

void DelayBasedTimeSource::SetClient(TimeSourceClient* client) {
  client_ = client;
}

void DelayBasedTimeSource::SetTimebaseAndInterval(base::TimeTicks timebase,
                                                  base::TimeDelta interval) {
  DCHECK_GT(interval.ToInternalValue(), 0);
  next_parameters_.interval = interval;
  next_parameters_.tick_target = timebase;

  if (!active_) {
    // If we aren't active, there's no need to reset the timer.
    return;
  }

  // If the change in interval is larger than the change threshold,
  // request an immediate reset.
  double interval_delta =
      std::abs((interval - current_parameters_.interval).InSecondsF());
  double interval_change = interval_delta / interval.InSecondsF();
  if (interval_change > kIntervalChangeThreshold) {
    TRACE_EVENT_INSTANT0("cc", "DelayBasedTimeSource::IntervalChanged",
                         TRACE_EVENT_SCOPE_THREAD);
    SetActive(false);
    SetActive(true);
    return;
  }

  // If the change in phase is greater than the change threshold in either
  // direction, request an immediate reset. This logic might result in a false
  // negative if there is a simultaneous small change in the interval and the
  // fmod just happens to return something near zero. Assuming the timebase
  // is very recent though, which it should be, we'll still be ok because the
  // old clock and new clock just happen to line up.
  double target_delta =
      std::abs((timebase - current_parameters_.tick_target).InSecondsF());
  double phase_change =
      fmod(target_delta, interval.InSecondsF()) / interval.InSecondsF();
  if (phase_change > kPhaseChangeThreshold &&
      phase_change < (1.0 - kPhaseChangeThreshold)) {
    TRACE_EVENT_INSTANT0("cc", "DelayBasedTimeSource::PhaseChanged",
                         TRACE_EVENT_SCOPE_THREAD);
    SetActive(false);
    SetActive(true);
    return;
  }
}

base::TimeTicks DelayBasedTimeSource::Now() const {
  return base::TimeTicks::Now();
}

// This code tries to achieve an average tick rate as close to interval_ as
// possible.  To do this, it has to deal with a few basic issues:
//   1. PostDelayedTask can delay only at a millisecond granularity. So, 16.666
//   has to posted as 16 or 17.
//   2. A delayed task may come back a bit late (a few ms), or really late
//   (frames later)
//
// The basic idea with this scheduler here is to keep track of where we *want*
// to run in tick_target_. We update this with the exact interval.
//
// Then, when we post our task, we take the floor of (tick_target_ and Now()).
// If we started at now=0, and 60FPs (all times in milliseconds):
//      now=0    target=16.667   PostDelayedTask(16)
//
// When our callback runs, we figure out how far off we were from that goal.
// Because of the flooring operation, and assuming our timer runs exactly when
// it should, this yields:
//      now=16   target=16.667
//
// Since we can't post a 0.667 ms task to get to now=16, we just treat this as a
// tick. Then, we update target to be 33.333. We now post another task based on
// the difference between our target and now:
//      now=16   tick_target=16.667  new_target=33.333   -->
//          PostDelayedTask(floor(33.333 - 16)) --> PostDelayedTask(17)
//
// Over time, with no late tasks, this leads to us posting tasks like this:
//      now=0    tick_target=0       new_target=16.667   -->
//          tick(), PostDelayedTask(16)
//      now=16   tick_target=16.667  new_target=33.333   -->
//          tick(), PostDelayedTask(17)
//      now=33   tick_target=33.333  new_target=50.000   -->
//          tick(), PostDelayedTask(17)
//      now=50   tick_target=50.000  new_target=66.667   -->
//          tick(), PostDelayedTask(16)
//
// We treat delays in tasks differently depending on the amount of delay we
// encounter. Suppose we posted a task with a target=16.667:
//   Case 1: late but not unrecoverably-so
//      now=18 tick_target=16.667
//
//   Case 2: so late we obviously missed the tick
//      now=25.0 tick_target=16.667
//
// We treat the first case as a tick anyway, and assume the delay was unusual.
// Thus, we compute the new_target based on the old timebase:
//      now=18   tick_target=16.667  new_target=33.333   -->
//          tick(), PostDelayedTask(floor(33.333-18)) --> PostDelayedTask(15)
// This brings us back to 18+15 = 33, which was where we would have been if the
// task hadn't been late.
//
// For the really late delay, we we move to the next logical tick. The timebase
// is not reset.
//      now=37   tick_target=16.667  new_target=50.000  -->
//          tick(), PostDelayedTask(floor(50.000-37)) --> PostDelayedTask(13)
base::TimeTicks DelayBasedTimeSource::NextTickTarget(base::TimeTicks now) {
  base::TimeDelta new_interval = next_parameters_.interval;

  // |interval_offset| is the offset from |now| to the next multiple of
  // |interval| after |tick_target|, possibly negative if in the past.
  base::TimeDelta interval_offset = base::TimeDelta::FromInternalValue(
      (next_parameters_.tick_target - now).ToInternalValue() %
      new_interval.ToInternalValue());
  // If |now| is exactly on the interval (i.e. offset==0), don't adjust.
  // Otherwise, if |tick_target| was in the past, adjust forward to the next
  // tick after |now|.
  if (interval_offset.ToInternalValue() != 0 &&
      next_parameters_.tick_target < now) {
    interval_offset += new_interval;
  }

  base::TimeTicks new_tick_target = now + interval_offset;
  DCHECK(now <= new_tick_target)
      << "now = " << now.ToInternalValue()
      << "; new_tick_target = " << new_tick_target.ToInternalValue()
      << "; new_interval = " << new_interval.InMicroseconds()
      << "; tick_target = " << next_parameters_.tick_target.ToInternalValue()
      << "; interval_offset = " << interval_offset.ToInternalValue();

  // Avoid double ticks when:
  // 1) Turning off the timer and turning it right back on.
  // 2) Jittery data is passed to SetTimebaseAndInterval().
  if (new_tick_target - last_tick_time_ <= new_interval / kDoubleTickDivisor)
    new_tick_target += new_interval;

  return new_tick_target;
}

void DelayBasedTimeSource::PostNextTickTask(base::TimeTicks now) {
  base::TimeTicks new_tick_target = NextTickTarget(now);

  // Post another task *before* the tick and update state
  base::TimeDelta delay;
  if (now <= new_tick_target)
    delay = new_tick_target - now;
  task_runner_->PostDelayedTask(FROM_HERE,
                                base::Bind(&DelayBasedTimeSource::OnTimerFired,
                                           weak_factory_.GetWeakPtr()),
                                delay);

  next_parameters_.tick_target = new_tick_target;
  current_parameters_ = next_parameters_;
}

std::string DelayBasedTimeSource::TypeString() const {
  return "DelayBasedTimeSource";
}

std::string DelayBasedTimeSourceHighRes::TypeString() const {
  return "DelayBasedTimeSourceHighRes";
}

void DelayBasedTimeSource::AsValueInto(base::debug::TracedValue* state) const {
  state->SetString("type", TypeString());
  state->SetDouble("last_tick_time_us", LastTickTime().ToInternalValue());
  state->SetDouble("next_tick_time_us", NextTickTime().ToInternalValue());

  state->BeginDictionary("current_parameters");
  state->SetDouble("interval_us",
                   current_parameters_.interval.InMicroseconds());
  state->SetDouble("tick_target_us",
                   current_parameters_.tick_target.ToInternalValue());
  state->EndDictionary();

  state->BeginDictionary("next_parameters");
  state->SetDouble("interval_us", next_parameters_.interval.InMicroseconds());
  state->SetDouble("tick_target_us",
                   next_parameters_.tick_target.ToInternalValue());
  state->EndDictionary();

  state->SetBoolean("active", active_);
}

}  // namespace cc
