mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
108 lines
3.1 KiB
C++
108 lines
3.1 KiB
C++
// Copyright 2013 The Flutter 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 "flutter/shell/common/thread_host.h"
|
|
|
|
#include <algorithm>
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
namespace flutter {
|
|
|
|
std::string ThreadHost::ThreadHostConfig::MakeThreadName(
|
|
Type type,
|
|
const std::string& prefix) {
|
|
switch (type) {
|
|
case Type::Platform:
|
|
return prefix + ".platform";
|
|
case Type::UI:
|
|
return prefix + ".ui";
|
|
case Type::IO:
|
|
return prefix + ".io";
|
|
case Type::RASTER:
|
|
return prefix + ".raster";
|
|
case Type::Profiler:
|
|
return prefix + ".profiler";
|
|
}
|
|
}
|
|
|
|
void ThreadHost::ThreadHostConfig::SetIOConfig(const ThreadConfig& config) {
|
|
type_mask |= ThreadHost::Type::IO;
|
|
io_config = config;
|
|
}
|
|
|
|
void ThreadHost::ThreadHostConfig::SetUIConfig(const ThreadConfig& config) {
|
|
type_mask |= ThreadHost::Type::UI;
|
|
ui_config = config;
|
|
}
|
|
|
|
void ThreadHost::ThreadHostConfig::SetPlatformConfig(
|
|
const ThreadConfig& config) {
|
|
type_mask |= ThreadHost::Type::Platform;
|
|
platform_config = config;
|
|
}
|
|
|
|
void ThreadHost::ThreadHostConfig::SetRasterConfig(const ThreadConfig& config) {
|
|
type_mask |= ThreadHost::Type::RASTER;
|
|
raster_config = config;
|
|
}
|
|
|
|
void ThreadHost::ThreadHostConfig::SetProfilerConfig(
|
|
const ThreadConfig& config) {
|
|
type_mask |= ThreadHost::Type::Profiler;
|
|
profiler_config = config;
|
|
}
|
|
|
|
std::unique_ptr<fml::Thread> ThreadHost::CreateThread(
|
|
Type type,
|
|
std::optional<ThreadConfig> thread_config,
|
|
const ThreadHostConfig& host_config) const {
|
|
/// if not specified ThreadConfig, create a ThreadConfig.
|
|
if (!thread_config.has_value()) {
|
|
thread_config = ThreadConfig(
|
|
ThreadHostConfig::MakeThreadName(type, host_config.name_prefix));
|
|
}
|
|
return std::make_unique<fml::Thread>(host_config.config_setter,
|
|
thread_config.value());
|
|
}
|
|
|
|
ThreadHost::ThreadHost() = default;
|
|
|
|
ThreadHost::ThreadHost(ThreadHost&&) = default;
|
|
|
|
ThreadHost::ThreadHost(const std::string& name_prefix, uint64_t mask)
|
|
: ThreadHost(ThreadHostConfig(name_prefix, mask)) {}
|
|
|
|
ThreadHost::ThreadHost(const ThreadHostConfig& host_config)
|
|
: name_prefix(host_config.name_prefix) {
|
|
if (host_config.isThreadNeeded(ThreadHost::Type::Platform)) {
|
|
platform_thread =
|
|
CreateThread(Type::Platform, host_config.platform_config, host_config);
|
|
}
|
|
|
|
if (host_config.isThreadNeeded(ThreadHost::Type::UI)) {
|
|
ui_thread = CreateThread(Type::UI, host_config.ui_config, host_config);
|
|
}
|
|
|
|
if (host_config.isThreadNeeded(ThreadHost::Type::RASTER)) {
|
|
raster_thread =
|
|
CreateThread(Type::RASTER, host_config.raster_config, host_config);
|
|
}
|
|
|
|
if (host_config.isThreadNeeded(ThreadHost::Type::IO)) {
|
|
io_thread = CreateThread(Type::IO, host_config.io_config, host_config);
|
|
}
|
|
|
|
if (host_config.isThreadNeeded(ThreadHost::Type::Profiler)) {
|
|
profiler_thread =
|
|
CreateThread(Type::Profiler, host_config.profiler_config, host_config);
|
|
}
|
|
}
|
|
|
|
ThreadHost::~ThreadHost() = default;
|
|
|
|
} // namespace flutter
|