summaryrefslogtreecommitdiff
path: root/chromium/media/midi/task_service.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/midi/task_service.cc')
-rw-r--r--chromium/media/midi/task_service.cc35
1 files changed, 19 insertions, 16 deletions
diff --git a/chromium/media/midi/task_service.cc b/chromium/media/midi/task_service.cc
index 3bb3baf01b5..563d63fbf91 100644
--- a/chromium/media/midi/task_service.cc
+++ b/chromium/media/midi/task_service.cc
@@ -12,19 +12,10 @@
namespace midi {
-namespace {
-
-constexpr TaskService::InstanceId kInvalidInstanceId = -1;
-
-} // namespace
-
constexpr TaskService::RunnerId TaskService::kDefaultRunnerId;
+constexpr TaskService::InstanceId TaskService::kInvalidInstanceId;
-TaskService::TaskService()
- : no_tasks_in_flight_cv_(&tasks_in_flight_lock_),
- tasks_in_flight_(0),
- next_instance_id_(0),
- bound_instance_id_(kInvalidInstanceId) {
+TaskService::TaskService() : no_tasks_in_flight_cv_(&tasks_in_flight_lock_) {
DETACH_FROM_SEQUENCE(instance_binding_sequence_checker_);
}
@@ -45,10 +36,17 @@ bool TaskService::BindInstance() {
base::AutoLock lock(lock_);
if (bound_instance_id_ != kInvalidInstanceId)
return false;
- bound_instance_id_ = next_instance_id_++;
+
+ // If the InstanceId reaches to the limit, just fail rather than doing
+ // something nicer for such impractical case.
+ if (std::numeric_limits<InstanceId>::max() == next_instance_id_)
+ return false;
+
+ bound_instance_id_ = ++next_instance_id_;
DCHECK(!default_task_runner_);
default_task_runner_ = base::ThreadTaskRunnerHandle::Get();
+
return true;
}
@@ -58,16 +56,17 @@ bool TaskService::UnbindInstance() {
base::AutoLock lock(lock_);
if (bound_instance_id_ == kInvalidInstanceId)
return false;
+
+ DCHECK_EQ(next_instance_id_, bound_instance_id_);
bound_instance_id_ = kInvalidInstanceId;
DCHECK(default_task_runner_);
default_task_runner_ = nullptr;
}
-
// From now on RunTask will never run any task bound to the instance id.
// But invoked tasks might be still running here. To ensure no task runs on
// quitting this method, wait for all tasks to complete.
- base::AutoLock tasks_in_flight_auto_lock(tasks_in_flight_lock_);
+ base::AutoLock tasks_in_flight_lock(tasks_in_flight_lock_);
// TODO(https://crbug.com/796830): Remove sync operations on the I/O thread.
base::ScopedAllowBaseSyncPrimitivesOutsideBlockingScope allow_wait;
while (tasks_in_flight_ > 0)
@@ -126,6 +125,10 @@ void TaskService::PostBoundDelayedTask(RunnerId runner_id,
delay);
}
+void TaskService::OverflowInstanceIdForTesting() {
+ next_instance_id_ = std::numeric_limits<InstanceId>::max();
+}
+
scoped_refptr<base::SingleThreadTaskRunner> TaskService::GetTaskRunner(
RunnerId runner_id) {
base::AutoLock lock(lock_);
@@ -154,7 +157,7 @@ void TaskService::RunTask(InstanceId instance_id,
RunnerId runner_id,
base::OnceClosure task) {
{
- base::AutoLock tasks_in_flight_auto_lock(tasks_in_flight_lock_);
+ base::AutoLock tasks_in_flight_lock(tasks_in_flight_lock_);
++tasks_in_flight_;
}
@@ -162,7 +165,7 @@ void TaskService::RunTask(InstanceId instance_id,
std::move(task).Run();
{
- base::AutoLock tasks_in_flight_auto_lock(tasks_in_flight_lock_);
+ base::AutoLock tasks_in_flight_lock(tasks_in_flight_lock_);
--tasks_in_flight_;
DCHECK_GE(tasks_in_flight_, 0);
if (tasks_in_flight_ == 0)