1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CC_BASE_DELAYED_UNIQUE_NOTIFIER_H_
6#define CC_BASE_DELAYED_UNIQUE_NOTIFIER_H_
7
8#include "base/callback.h"
9#include "base/memory/weak_ptr.h"
10#include "cc/base/cc_export.h"
11
12namespace base {
13class SequencedTaskRunner;
14}  // namespace base
15
16namespace cc {
17
18class CC_EXPORT DelayedUniqueNotifier {
19 public:
20  // Configure this notifier to issue the |closure| notification in |delay| time
21  // from Schedule() call.
22  DelayedUniqueNotifier(base::SequencedTaskRunner* task_runner,
23                        const base::Closure& closure,
24                        const base::TimeDelta& delay);
25
26  // Destroying the notifier will ensure that no further notifications will
27  // happen from this class.
28  virtual ~DelayedUniqueNotifier();
29
30  // Schedule a notification to be run. If another notification is already
31  // pending, then it will happen in (at least) given delay from now. That is,
32  // if delay is 16ms and a notification has been scheduled 10ms ago (ie, it
33  // should trigger in no less than 6ms), then calling schedule will ensure that
34  // the only notification that arrives will happen in (at least) 16ms from now.
35  void Schedule();
36
37  // Cancel any previously scheduled runs.
38  void Cancel();
39
40  // Returns true if a notification is currently scheduled to run.
41  bool HasPendingNotification() const;
42
43 protected:
44  // Virtual for testing.
45  virtual base::TimeTicks Now() const;
46
47 private:
48  void NotifyIfTime();
49
50  base::SequencedTaskRunner* task_runner_;
51  base::Closure closure_;
52  base::TimeDelta delay_;
53  base::TimeTicks next_notification_time_;
54  bool notification_pending_;
55
56  base::WeakPtrFactory<DelayedUniqueNotifier> weak_ptr_factory_;
57};
58
59}  // namespace cc
60
61#endif  // CC_BASE_DELAYED_UNIQUE_NOTIFIER_H_
62