summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/notifier/chrome_system_resources.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sync/notifier/chrome_system_resources.cc')
-rw-r--r--chrome/browser/sync/notifier/chrome_system_resources.cc99
1 files changed, 99 insertions, 0 deletions
diff --git a/chrome/browser/sync/notifier/chrome_system_resources.cc b/chrome/browser/sync/notifier/chrome_system_resources.cc
new file mode 100644
index 0000000..21c148c
--- /dev/null
+++ b/chrome/browser/sync/notifier/chrome_system_resources.cc
@@ -0,0 +1,99 @@
+// Copyright (c) 2010 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 "chrome/browser/sync/notifier/chrome_system_resources.h"
+
+#include <cstdlib>
+#include <string>
+
+#include "base/logging.h"
+#include "base/message_loop.h"
+#include "base/stl_util-inl.h"
+#include "base/string_util.h"
+#include "chrome/browser/sync/notifier/invalidation_util.h"
+
+namespace sync_notifier {
+
+ChromeSystemResources::ChromeSystemResources() {
+ DCHECK(non_thread_safe_.CalledOnValidThread());
+}
+
+ChromeSystemResources::~ChromeSystemResources() {
+ DCHECK(non_thread_safe_.CalledOnValidThread());
+ StopScheduler();
+}
+
+invalidation::Time ChromeSystemResources::current_time() {
+ DCHECK(non_thread_safe_.CalledOnValidThread());
+ return base::Time::Now();
+}
+
+void ChromeSystemResources::StartScheduler() {
+ DCHECK(non_thread_safe_.CalledOnValidThread());
+ scoped_runnable_method_factory_.reset(
+ new ScopedRunnableMethodFactory<ChromeSystemResources>(this));
+}
+
+void ChromeSystemResources::StopScheduler() {
+ DCHECK(non_thread_safe_.CalledOnValidThread());
+ scoped_runnable_method_factory_.reset();
+ STLDeleteElements(&posted_tasks_);
+}
+
+void ChromeSystemResources::ScheduleWithDelay(
+ invalidation::TimeDelta delay,
+ invalidation::Closure* task) {
+ DCHECK(non_thread_safe_.CalledOnValidThread());
+ Task* task_to_post = MakeTaskToPost(task);
+ if (!task_to_post) {
+ return;
+ }
+ MessageLoop::current()->PostDelayedTask(
+ FROM_HERE, task_to_post, delay.InMillisecondsRoundedUp());
+}
+
+void ChromeSystemResources::ScheduleImmediately(
+ invalidation::Closure* task) {
+ DCHECK(non_thread_safe_.CalledOnValidThread());
+ Task* task_to_post = MakeTaskToPost(task);
+ if (!task_to_post) {
+ return;
+ }
+ MessageLoop::current()->PostTask(FROM_HERE, task_to_post);
+}
+
+void ChromeSystemResources::Log(
+ LogLevel level, const char* file, int line,
+ const char* format, ...) {
+ DCHECK(non_thread_safe_.CalledOnValidThread());
+ va_list ap;
+ va_start(ap, format);
+ std::string result;
+ StringAppendV(&result, format, ap);
+ logging::LogMessage(file, line).stream() << result;
+ va_end(ap);
+}
+
+Task* ChromeSystemResources::MakeTaskToPost(
+ invalidation::Closure* task) {
+ DCHECK(non_thread_safe_.CalledOnValidThread());
+ DCHECK(invalidation::IsCallbackRepeatable(task));
+ if (!scoped_runnable_method_factory_.get()) {
+ delete task;
+ return NULL;
+ }
+ posted_tasks_.insert(task);
+ Task* task_to_post =
+ scoped_runnable_method_factory_->NewRunnableMethod(
+ &ChromeSystemResources::RunPostedTask, task);
+ return task_to_post;
+}
+
+void ChromeSystemResources::RunPostedTask(invalidation::Closure* task) {
+ DCHECK(non_thread_safe_.CalledOnValidThread());
+ RunAndDeleteClosure(task);
+ posted_tasks_.erase(task);
+}
+
+} // namespace sync_notifier