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)#include "cc/base/unique_notifier.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/bind.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/bind_helpers.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/location.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/sequenced_task_runner.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace cc {
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)UniqueNotifier::UniqueNotifier(base::SequencedTaskRunner* task_runner,
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               const base::Closure& closure)
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : task_runner_(task_runner),
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      closure_(closure),
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      notification_pending_(false),
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      weak_ptr_factory_(this) {
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)UniqueNotifier::~UniqueNotifier() {
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void UniqueNotifier::Schedule() {
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (notification_pending_)
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  task_runner_->PostTask(
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      FROM_HERE,
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&UniqueNotifier::Notify, weak_ptr_factory_.GetWeakPtr()));
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  notification_pending_ = true;
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void UniqueNotifier::Notify() {
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Note that the order here is important in case closure schedules another
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // run.
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  notification_pending_ = false;
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  closure_.Run();
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace cc
43