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