blob: eabd5eb92f1374782ea58d8205a40a552fc2805b [file] [log] [blame]
// 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.
#ifndef FLUTTER_SHELL_COMMON_THREAD_HOST_H_
#define FLUTTER_SHELL_COMMON_THREAD_HOST_H_
#include <memory>
#include <optional>
#include <string>
#include "flutter/fml/macros.h"
#include "flutter/fml/thread.h"
namespace flutter {
using ThreadConfig = fml::Thread::ThreadConfig;
using ThreadConfigSetter = fml::Thread::ThreadConfigSetter;
/// The collection of all the threads used by the engine.
struct ThreadHost {
enum Type {
kPlatform = 1 << 0,
kUi = 1 << 1,
kRaster = 1 << 2,
kIo = 1 << 3,
kProfiler = 1 << 4,
};
/// The collection of all the thread configures, and we create custom thread
/// configure in engine to info the thread.
struct ThreadHostConfig {
explicit ThreadHostConfig(
const ThreadConfigSetter& setter = fml::Thread::SetCurrentThreadName)
: type_mask(0), config_setter(setter) {}
ThreadHostConfig(
const std::string& name_prefix,
uint64_t mask,
const ThreadConfigSetter& setter = fml::Thread::SetCurrentThreadName)
: type_mask(mask), name_prefix(name_prefix), config_setter(setter) {}
explicit ThreadHostConfig(
uint64_t mask,
const ThreadConfigSetter& setter = fml::Thread::SetCurrentThreadName)
: ThreadHostConfig("", mask, setter) {}
/// Check if need to create thread.
bool isThreadNeeded(Type type) const { return type_mask & type; }
/// Use the prefix and thread type to generator a thread name.
static std::string MakeThreadName(Type type, const std::string& prefix);
/// Specified the UI Thread Config, meanwhile set the mask.
void SetUIConfig(const ThreadConfig&);
/// Specified the Platform Thread Config, meanwhile set the mask.
void SetPlatformConfig(const ThreadConfig&);
/// Specified the IO Thread Config, meanwhile set the mask.
void SetRasterConfig(const ThreadConfig&);
/// Specified the IO Thread Config, meanwhile set the mask.
void SetIOConfig(const ThreadConfig&);
/// Specified the ProfilerThread Config, meanwhile set the mask.
void SetProfilerConfig(const ThreadConfig&);
uint64_t type_mask;
std::string name_prefix = "";
const ThreadConfigSetter config_setter;
std::optional<ThreadConfig> platform_config;
std::optional<ThreadConfig> ui_config;
std::optional<ThreadConfig> raster_config;
std::optional<ThreadConfig> io_config;
std::optional<ThreadConfig> profiler_config;
};
std::string name_prefix;
std::unique_ptr<fml::Thread> platform_thread;
std::unique_ptr<fml::Thread> ui_thread;
std::unique_ptr<fml::Thread> raster_thread;
std::unique_ptr<fml::Thread> io_thread;
std::unique_ptr<fml::Thread> profiler_thread;
ThreadHost();
ThreadHost(ThreadHost&&);
ThreadHost& operator=(ThreadHost&&) = default;
ThreadHost(const std::string& name_prefix, uint64_t mask);
explicit ThreadHost(const ThreadHostConfig& host_config);
~ThreadHost();
private:
std::unique_ptr<fml::Thread> CreateThread(
Type type,
std::optional<ThreadConfig> thread_config,
const ThreadHostConfig& host_config) const;
};
} // namespace flutter
#endif // FLUTTER_SHELL_COMMON_THREAD_HOST_H_