Bug 1259274: [MSE] P4. Add AutoTaskQueue convenience class. r=gerald draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Sat, 26 Mar 2016 02:09:26 +1100
changeset 345010 9fc214e120c0c571904455a90bca29bd2132303c
parent 345009 4de842536536240f39b04d29c4ceefb30de57458
child 345011 fc6f0b5a774f34623e95a94c562954c37e44a7dc
push id13993
push userbmo:jyavenard@mozilla.com
push dateSun, 27 Mar 2016 11:56:19 +0000
reviewersgerald
bugs1259274
milestone48.0a1
Bug 1259274: [MSE] P4. Add AutoTaskQueue convenience class. r=gerald Just like TaskQueue, but doesn't require to be shutdown. MozReview-Commit-ID: 9JR9mZZuP4w
dom/media/mediasource/AutoTaskQueue.h
dom/media/mediasource/moz.build
new file mode 100644
--- /dev/null
+++ b/dom/media/mediasource/AutoTaskQueue.h
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef MOZILLA_AUTOTASKQUEUE_H_
+#define MOZILLA_AUTOTASKQUEUE_H_
+
+#include "mozilla/RefPtr.h"
+#include "mozilla/TaskQueue.h"
+
+namespace mozilla {
+
+// A convenience TaskQueue not requiring explicit shutdown.
+class AutoTaskQueue : public AbstractThread
+{
+public:
+  explicit AutoTaskQueue(already_AddRefed<SharedThreadPool> aPool, bool aSupportsTailDispatch = false)
+  : AbstractThread(aSupportsTailDispatch)
+  , mTaskQueue(new TaskQueue(Move(aPool), aSupportsTailDispatch))
+  {}
+
+  TaskDispatcher& TailDispatcher() override
+  {
+    return mTaskQueue->TailDispatcher();
+  }
+
+  void Dispatch(already_AddRefed<nsIRunnable> aRunnable,
+                DispatchFailureHandling aFailureHandling = AssertDispatchSuccess,
+                DispatchReason aReason = NormalDispatch) override
+  {
+    mTaskQueue->Dispatch(Move(aRunnable), aFailureHandling, aReason);
+  }
+
+  // Blocks until all tasks finish executing.
+  void AwaitIdle() { mTaskQueue->AwaitIdle(); }
+
+  bool IsEmpty() { return mTaskQueue->IsEmpty(); }
+
+  // Returns true if the current thread is currently running a Runnable in
+  // the task queue.
+  bool IsCurrentThreadIn() override { return mTaskQueue->IsCurrentThreadIn(); }
+
+private:
+  ~AutoTaskQueue()
+  {
+    RefPtr<TaskQueue> taskqueue = mTaskQueue;
+    nsCOMPtr<nsIRunnable> task =
+      NS_NewRunnableFunction([taskqueue]() { taskqueue->BeginShutdown(); });
+    AbstractThread::MainThread()->Dispatch(task.forget());
+  }
+  RefPtr<TaskQueue> mTaskQueue;
+};
+
+} // namespace mozilla
+
+#endif
--- a/dom/media/mediasource/moz.build
+++ b/dom/media/mediasource/moz.build
@@ -2,16 +2,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 MOCHITEST_MANIFESTS += ['test/mochitest.ini']
 
 EXPORTS += [
     'AsyncEventRunner.h',
+    'AutoTaskQueue.h',
     'MediaSourceDecoder.h',
     'MediaSourceDemuxer.h',
     'SourceBufferAttributes.h',
     'SourceBufferTask.h',
     'TrackBuffersManager.h',
 ]
 
 EXPORTS.mozilla.dom += [