Home | History | Annotate | Download | only in base
      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