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