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