Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Unified Diff: third_party/webrtc_overrides/webrtc/base/task_queue.cc

Issue 2293913003: Override webrtc task_queue.cc and task_queue.h. (Closed)
Patch Set: Override webrtc task_queue.cc and task_queue.h. This is step 3 of the plan below. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« DEPS ('K') | « third_party/webrtc_overrides/webrtc/base/task_queue.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/webrtc_overrides/webrtc/base/task_queue.cc
diff --git a/third_party/webrtc_overrides/webrtc/base/task_queue.cc b/third_party/webrtc_overrides/webrtc/base/task_queue.cc
new file mode 100644
index 0000000000000000000000000000000000000000..583554da33e5c27be5945a566dd8f6ec888c3663
--- /dev/null
+++ b/third_party/webrtc_overrides/webrtc/base/task_queue.cc
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2016 The WebRTC Project Authors. All rights reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "third_party/webrtc_overrides/webrtc/base/task_queue.h"
+
+#include "base/bind.h"
+#include "base/lazy_instance.h"
+#include "base/threading/thread.h"
+#include "base/threading/thread_local.h"
+
+namespace rtc {
+namespace {
+
+void RunTask(std::unique_ptr<QueuedTask> task) {
+ if (!task->Run())
+ task.release();
+}
+
+class PostAndReplyTask : public QueuedTask {
+ public:
+ PostAndReplyTask(
+ std::unique_ptr<QueuedTask> task,
+ std::unique_ptr<QueuedTask> reply,
+ const scoped_refptr<base::SingleThreadTaskRunner>& reply_task_runner)
+ : task_(std::move(task)),
+ reply_(std::move(reply)),
+ reply_task_runner_(reply_task_runner) {}
+
+ ~PostAndReplyTask() override {}
+
+ private:
+ bool Run() override {
+ if (!task_->Run())
+ task_.release();
+
+ reply_task_runner_->PostTask(FROM_HERE,
+ base::Bind(&RunTask, base::Passed(&reply_)));
+ return true;
+ }
+
+ std::unique_ptr<QueuedTask> task_;
+ std::unique_ptr<QueuedTask> reply_;
+ scoped_refptr<base::SingleThreadTaskRunner> reply_task_runner_;
+};
+
+// A lazily created thread local storage for quick access to a TaskQueue.
+base::LazyInstance<base::ThreadLocalPointer<TaskQueue>>::Leaky lazy_tls_ptr =
+ LAZY_INSTANCE_INITIALIZER;
+
+} // namespace
+
+bool TaskQueue::IsCurrent() const {
+ return Current() == this;
+}
+
+class TaskQueue::WorkerThread : public base::Thread {
+ public:
+ WorkerThread(const char* queue_name, TaskQueue* queue);
+ ~WorkerThread() override;
+
+ private:
+ virtual void Init() override;
+
+ TaskQueue* const queue_;
+};
+
+TaskQueue::WorkerThread::WorkerThread(const char* queue_name, TaskQueue* queue)
+ : base::Thread(queue_name), queue_(queue) {}
+
+void TaskQueue::WorkerThread::Init() {
+ lazy_tls_ptr.Pointer()->Set(queue_);
+}
+
+TaskQueue::WorkerThread::~WorkerThread() {
+ DCHECK(!Thread::IsRunning());
+}
+
+TaskQueue::TaskQueue(const char* queue_name)
+ : thread_(
+ std::unique_ptr<WorkerThread>(new WorkerThread(queue_name, this))) {
+ DCHECK(queue_name);
+ bool result = thread_->Start();
+ CHECK(result);
+}
+
+TaskQueue::~TaskQueue() {
+ DCHECK(!IsCurrent());
+ thread_->Stop();
+}
+
+// static
+TaskQueue* TaskQueue::Current() {
+ return lazy_tls_ptr.Pointer()->Get();
+}
+
+// static
+bool TaskQueue::IsCurrent(const char* queue_name) {
+ TaskQueue* current = Current();
+ return current && current->thread_->thread_name().compare(queue_name) == 0;
+}
+
+void TaskQueue::PostTask(std::unique_ptr<QueuedTask> task) {
+ thread_->task_runner()->PostTask(FROM_HERE,
+ base::Bind(&RunTask, base::Passed(&task)));
+}
+
+void TaskQueue::PostDelayedTask(std::unique_ptr<QueuedTask> task,
+ uint32_t milliseconds) {
+ thread_->task_runner()->PostDelayedTask(
+ FROM_HERE, base::Bind(&RunTask, base::Passed(&task)),
+ base::TimeDelta::FromMilliseconds(milliseconds));
+}
+
+void TaskQueue::PostTaskAndReply(std::unique_ptr<QueuedTask> task,
+ std::unique_ptr<QueuedTask> reply,
+ TaskQueue* reply_queue) {
+ PostTask(std::unique_ptr<QueuedTask>(new PostAndReplyTask(
+ std::move(task), std::move(reply), reply_queue->thread_->task_runner())));
+}
+
+void TaskQueue::PostTaskAndReply(std::unique_ptr<QueuedTask> task,
+ std::unique_ptr<QueuedTask> reply) {
+ thread_->task_runner()->PostTaskAndReply(
+ FROM_HERE, base::Bind(&RunTask, base::Passed(&task)),
+ base::Bind(&RunTask, base::Passed(&reply)));
+}
+
+} // namespace rtc
« DEPS ('K') | « third_party/webrtc_overrides/webrtc/base/task_queue.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698