• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
12 namespace base {
13 class SequencedTaskRunner;
14 }  // namespace base
15 
16 namespace cc {
17 
18 class 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