1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef CC_BASE_UNIQUE_NOTIFIER_H_ 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define CC_BASE_UNIQUE_NOTIFIER_H_ 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/callback.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/weak_ptr.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/base/cc_export.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace base { 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class SequencedTaskRunner; 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace base 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace cc { 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class CC_EXPORT UniqueNotifier { 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Configure this notifier to issue the |closure| notification when scheduled. 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UniqueNotifier(base::SequencedTaskRunner* task_runner, 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::Closure& closure); 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Destroying the notifier will ensure that no further notifications will 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // happen from this class. 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ~UniqueNotifier(); 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Schedule a notification to be run. If another notification is already 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // pending, then only one notification will take place. 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void Schedule(); 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void Notify(); 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(dcheng): How come this doesn't need to hold a ref to the task runner? 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::SequencedTaskRunner* task_runner_; 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Closure closure_; 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool notification_pending_; 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::WeakPtrFactory<UniqueNotifier> weak_ptr_factory_; 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace cc 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // CC_BASE_UNIQUE_NOTIFIER_H_ 46