text: // 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 {
      Platform = 1 << 0,
      UI = 1 << 1,
      RASTER = 1 << 2,
      IO = 1 << 3,
      Profiler = 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_
  