diff options
Diffstat (limited to 'chromium/media/midi/task_service.cc')
-rw-r--r-- | chromium/media/midi/task_service.cc | 35 |
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) |