| // Copyright 2018 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 GARNET_BIN_DEBUG_AGENT_LAUNCHER_H_ |
| #define GARNET_BIN_DEBUG_AGENT_LAUNCHER_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include <lib/zx/process.h> |
| #include "garnet/lib/process/process_builder.h" |
| #include "lib/svc/cpp/services.h" |
| |
| #include "lib/fxl/macros.h" |
| |
| namespace debug_agent { |
| |
| // This class is designed to help two-phase process creation, where a process |
| // needs to be setup, but before starting it that process needs to be |
| // registered with the exception handler. |
| // |
| // Launchpad and our calling code have different semantics which makes a bit |
| // of a mismatch. Launchpad normally expects to work by doing setup and then |
| // returning ownership of its internal process handle at the end of launching. |
| // But our code needs to set up the exception handling before code starts |
| // executing, and expects to own the handle its using. |
| class Launcher { |
| public: |
| explicit Launcher(std::shared_ptr<component::Services> env_services); |
| ~Launcher() = default; |
| |
| // Setup will create the process object but not launch the process yet. |
| zx_status_t Setup(const std::vector<std::string>& argv); |
| |
| // Accessor for a copy of the process handle, valid between Setup() and |
| // Start(). |
| zx::process GetProcess() const; |
| |
| // Completes process launching. |
| zx_status_t Start(); |
| |
| private: |
| process::ProcessBuilder builder_; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(Launcher); |
| }; |
| |
| } // namespace debug_agent |
| |
| #endif // GARNET_BIN_DEBUG_AGENT_LAUNCHER_H_ |