diff options
Diffstat (limited to 'chromium/cc/base/unique_notifier.cc')
-rw-r--r-- | chromium/cc/base/unique_notifier.cc | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/chromium/cc/base/unique_notifier.cc b/chromium/cc/base/unique_notifier.cc new file mode 100644 index 00000000000..0656c6d747b --- /dev/null +++ b/chromium/cc/base/unique_notifier.cc @@ -0,0 +1,42 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cc/base/unique_notifier.h" + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/location.h" +#include "base/sequenced_task_runner.h" + +namespace cc { + +UniqueNotifier::UniqueNotifier(base::SequencedTaskRunner* task_runner, + const base::Closure& closure) + : task_runner_(task_runner), + closure_(closure), + notification_pending_(false), + weak_ptr_factory_(this) { +} + +UniqueNotifier::~UniqueNotifier() { +} + +void UniqueNotifier::Schedule() { + if (notification_pending_) + return; + + task_runner_->PostTask( + FROM_HERE, + base::Bind(&UniqueNotifier::Notify, weak_ptr_factory_.GetWeakPtr())); + notification_pending_ = true; +} + +void UniqueNotifier::Notify() { + // Note that the order here is important in case closure schedules another + // run. + notification_pending_ = false; + closure_.Run(); +} + +} // namespace cc |