| // Copyright 2018 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. |
| |
| #include "base/task/task_executor.h" |
| |
| #include <type_traits> |
| |
| #include "base/task/task_traits.h" |
| #include "base/task/task_traits_extension.h" |
| |
| namespace base { |
| |
| namespace { |
| |
| // Maps TaskTraits extension IDs to registered TaskExecutors. Index |n| |
| // corresponds to id |n - 1|. |
| using TaskExecutorMap = |
| std::array<TaskExecutor*, TaskTraitsExtensionStorage::kMaxExtensionId>; |
| TaskExecutorMap* GetTaskExecutorMap() { |
| static_assert(std::is_trivially_destructible<TaskExecutorMap>::value, |
| "TaskExecutorMap not trivially destructible"); |
| static TaskExecutorMap executors{}; |
| return &executors; |
| } |
| |
| static_assert( |
| TaskTraitsExtensionStorage::kInvalidExtensionId == 0, |
| "TaskExecutorMap depends on 0 being an invalid TaskTraits extension ID"); |
| |
| } // namespace |
| |
| void RegisterTaskExecutor(uint8_t extension_id, TaskExecutor* task_executor) { |
| DCHECK_NE(extension_id, TaskTraitsExtensionStorage::kInvalidExtensionId); |
| DCHECK_LE(extension_id, TaskTraitsExtensionStorage::kMaxExtensionId); |
| DCHECK_EQ((*GetTaskExecutorMap())[extension_id - 1], nullptr); |
| |
| (*GetTaskExecutorMap())[extension_id - 1] = task_executor; |
| } |
| |
| void UnregisterTaskExecutorForTesting(uint8_t extension_id) { |
| DCHECK_NE(extension_id, TaskTraitsExtensionStorage::kInvalidExtensionId); |
| DCHECK_LE(extension_id, TaskTraitsExtensionStorage::kMaxExtensionId); |
| DCHECK_NE((*GetTaskExecutorMap())[extension_id - 1], nullptr); |
| |
| (*GetTaskExecutorMap())[extension_id - 1] = nullptr; |
| } |
| |
| TaskExecutor* GetRegisteredTaskExecutorForTraits(const TaskTraits& traits) { |
| uint8_t extension_id = traits.extension_id(); |
| if (extension_id != TaskTraitsExtensionStorage::kInvalidExtensionId) { |
| TaskExecutor* executor = (*GetTaskExecutorMap())[extension_id - 1]; |
| DCHECK(executor); |
| return executor; |
| } |
| |
| return nullptr; |
| } |
| |
| } // namespace base |