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