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

Unified Diff: media/midi/task_service.h

Issue 2741713002: Web MIDI: implement TaskService (Closed)
Patch Set: review #35 Created 3 years, 6 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
« no previous file with comments | « media/midi/midi_service.cc ('k') | media/midi/task_service.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/midi/task_service.h
diff --git a/media/midi/task_service.h b/media/midi/task_service.h
new file mode 100644
index 0000000000000000000000000000000000000000..4058aa5e89199918caf688801d8d158210a1b27a
--- /dev/null
+++ b/media/midi/task_service.h
@@ -0,0 +1,96 @@
+// Copyright 2017 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.
+
+#ifndef MEDIA_MIDI_TASK_SERVICE_H_
+#define MEDIA_MIDI_TASK_SERVICE_H_
+
+#include "base/callback_forward.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/single_thread_task_runner.h"
+#include "base/synchronization/lock.h"
+#include "base/threading/thread.h"
+#include "base/time/time.h"
+#include "media/midi/midi_export.h"
+
+namespace midi {
+
+// TaskService manages TaskRunners that can be used in midi and provides
+// functionalities to ensure thread safety.
+class MIDI_EXPORT TaskService final {
+ public:
+ using RunnerId = size_t;
+ using InstanceId = int;
+
+ static constexpr RunnerId kDefaultRunnerId = 0;
+
+ TaskService();
+ ~TaskService();
+
+ // Issues an InstanceId internally to post tasks via PostBoundTask() and
+ // PostDelayedBoundTask() with the InstanceId. Once UnbindInstance() is
+ // called, tasks posted via these methods with unbind InstanceId won't be
+ // invoked any more.
+ // Returns true if call is bound or unbound correctly. Otherwise returns
+ // false, that happens when the BindInstance() is called twice without
+ // unbinding the previous instance.
+ bool BindInstance();
+ bool UnbindInstance();
+
+ // Posts a task to run on a specified TaskRunner. |runner_id| should be
+ // kDefaultRunnerId or a positive number. If kDefaultRunnerId is specified
+ // the task runs on the thread on which BindInstance() is called. Other number
+ // will run the task on a dedicated thread that is bound to the |runner_id|.
+ void PostStaticTask(RunnerId runner_id, base::OnceClosure task);
+
+ // Posts a task to run on a specified TaskRunner, and ensures that the bound
+ // instance should not quit UnbindInstance() while a bound task is running.
+ // See PostStaticTask() for |runner_id|.
+ void PostBoundTask(RunnerId runner, base::OnceClosure task);
+ void PostBoundDelayedTask(RunnerId runner_id,
+ base::OnceClosure task,
+ base::TimeDelta delay);
+
+ private:
+ // Returns a SingleThreadTaskRunner reference. Each TaskRunner will be
+ // constructed on demand.
+ scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner(RunnerId runner_id);
+
+ // Helps to run a posted bound task on TaskRunner safely.
+ void RunTask(InstanceId instance_id,
+ RunnerId runner_id,
+ base::OnceClosure task);
+
+ // Keeps a TaskRunner for the thread that calls BindInstance() as a default
+ // task runner to run posted tasks.
+ scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
+
+ // Holds threads to host SingleThreadTaskRunners.
+ std::vector<std::unique_ptr<base::Thread>> threads_;
+
+ // Holds lock objects to ensure that tasks run while the instance is bound.
+ std::vector<std::unique_ptr<base::Lock>> thread_task_locks_;
+
+ // Holds InstanceId for the next bound instance.
+ InstanceId next_instance_id_;
+
+ // Holds InstanceId for the current bound instance.
+ InstanceId bound_instance_id_;
+
+ // Protects |next_instance_id_| and |bound_instance_id_|.
+ base::Lock instance_lock_;
+
+ // Protects all other members.
+ base::Lock lock_;
+
+ // If multiple locks should be obtained simultaneously, we should acquire them
+ // in the order below so to avoid deadklocks.
+ // |instance_lock_| -> |lock_| -> |(one of) thread_task_locks_|.
+
+ DISALLOW_COPY_AND_ASSIGN(TaskService);
+};
+
+}; // namespace midi
+
+#endif // MEDIA_MIDI_TASK_SERVICE_H_
« no previous file with comments | « media/midi/midi_service.cc ('k') | media/midi/task_service.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698