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