| // Copyright 2021 The Fuchsia 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 SRC_DEVELOPER_DEBUG_DEBUG_AGENT_ZIRCON_COMPONENT_MANAGER_H_ |
| #define SRC_DEVELOPER_DEBUG_DEBUG_AGENT_ZIRCON_COMPONENT_MANAGER_H_ |
| |
| #include <fuchsia/sys/cpp/fidl.h> |
| #include <fuchsia/sys2/cpp/fidl.h> |
| #include <lib/fidl/cpp/binding.h> |
| #include <lib/sys/cpp/service_directory.h> |
| |
| #include "src/developer/debug/debug_agent/component_manager.h" |
| #include "src/lib/fxl/memory/weak_ptr.h" |
| |
| namespace debug_agent { |
| |
| class ZirconComponentManager : public ComponentManager, public fuchsia::sys2::EventStream { |
| public: |
| struct ComponentDescription { |
| uint64_t component_id = 0; // 0 is invalid. |
| std::string url; |
| std::string process_name; |
| std::string filter; |
| }; |
| |
| explicit ZirconComponentManager(std::shared_ptr<sys::ServiceDirectory> services); |
| ~ZirconComponentManager() override = default; |
| |
| // ComponentManager implementation. |
| std::optional<ComponentInfo> FindComponentInfo(zx_koid_t job_koid) const override; |
| debug::Status LaunchComponent(DebuggedJob* root_job, const std::vector<std::string>& argv, |
| uint64_t* component_id) override; |
| uint64_t OnProcessStart(const std::string& filter, StdioHandles& out_stdio) override; |
| |
| // fuchsia::sys2::EventStream implementation. |
| void OnEvent(fuchsia::sys2::Event event) override; |
| |
| private: |
| void OnV1ComponentTerminated(int64_t return_code, const ComponentDescription& description, |
| fuchsia::sys::TerminationReason reason); |
| |
| std::shared_ptr<sys::ServiceDirectory> services_; |
| |
| std::map<zx_koid_t, ComponentInfo> running_component_info_; |
| fidl::Binding<fuchsia::sys2::EventStream> event_stream_binding_; |
| |
| // Each component launch is assigned an unique filter and id. This is because new components are |
| // attached via the job filter mechanism. When a particular filter attached, we use this id to |
| // know which component launch just happened and we can communicate it to the client. |
| struct ExpectedV1Component { |
| ComponentDescription description; |
| StdioHandles handles; |
| fuchsia::sys::ComponentControllerPtr controller; |
| }; |
| std::map<std::string, ExpectedV1Component> expected_v1_components_; |
| |
| // References to the running components. These need to be kept alive to keep the components |
| // running. |
| std::map<uint64_t, fuchsia::sys::ComponentControllerPtr> running_v1_components_; |
| |
| fxl::WeakPtrFactory<ZirconComponentManager> weak_factory_; |
| }; |
| |
| } // namespace debug_agent |
| |
| #endif // SRC_DEVELOPER_DEBUG_DEBUG_AGENT_ZIRCON_COMPONENT_MANAGER_H_ |