// 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.

#ifndef CC_SCHEDULER_DELAY_BASED_TIME_SOURCE_H_
#define CC_SCHEDULER_DELAY_BASED_TIME_SOURCE_H_

#include <string>

#include "base/cancelable_callback.h"
#include "base/memory/weak_ptr.h"
#include "base/values.h"
#include "cc/base/cc_export.h"

namespace base {
namespace trace_event {
class TracedValue;
}
class SingleThreadTaskRunner;
}

namespace cc {
class CC_EXPORT DelayBasedTimeSourceClient {
 public:
  virtual void OnTimerTick() = 0;

 protected:
  virtual ~DelayBasedTimeSourceClient() {}
};

// This timer implements a time source that achieves the specified interval
// in face of millisecond-precision delayed callbacks and random queueing
// delays. DelayBasedTimeSource uses base::TimeTicks::Now as its timebase.
class CC_EXPORT DelayBasedTimeSource {
 public:
  static scoped_ptr<DelayBasedTimeSource> Create(
      base::TimeDelta interval,
      base::SingleThreadTaskRunner* task_runner) {
    return make_scoped_ptr(new DelayBasedTimeSource(interval, task_runner));
  }

  virtual ~DelayBasedTimeSource();

  void SetClient(DelayBasedTimeSourceClient* client);

  void SetTimebaseAndInterval(base::TimeTicks timebase,
                              base::TimeDelta interval);

  base::TimeDelta Interval() const;

  // Returns the time for the last missed tick.
  base::TimeTicks SetActive(bool active);
  bool Active() const;

  // Get the last and next tick times. NextTickTime() returns null when
  // inactive.
  base::TimeTicks LastTickTime() const;
  base::TimeTicks NextTickTime() const;

  virtual void AsValueInto(base::trace_event::TracedValue* dict) const;

 protected:
  DelayBasedTimeSource(base::TimeDelta interval,
                       base::SingleThreadTaskRunner* task_runner);

  // Virtual for testing.
  virtual base::TimeTicks Now() const;
  virtual std::string TypeString() const;

 private:
  base::TimeTicks NextTickTarget(base::TimeTicks now) const;

  void PostNextTickTask(base::TimeTicks now);
  void ResetTickTask(base::TimeTicks now);

  void OnTimerTick();

  DelayBasedTimeSourceClient* client_;

  bool active_;

  base::TimeTicks timebase_;
  base::TimeDelta interval_;

  base::TimeTicks last_tick_time_;
  base::TimeTicks next_tick_time_;

  base::CancelableClosure tick_closure_;

  base::SingleThreadTaskRunner* task_runner_;

  base::WeakPtrFactory<DelayBasedTimeSource> weak_factory_;

  DISALLOW_COPY_AND_ASSIGN(DelayBasedTimeSource);
};

}  // namespace cc

#endif  // CC_SCHEDULER_DELAY_BASED_TIME_SOURCE_H_
