| // 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_ZXDB_CLIENT_JOB_CONTEXT_IMPL_H_ |
| #define GARNET_BIN_ZXDB_CLIENT_JOB_CONTEXT_IMPL_H_ |
| |
| #include "garnet/bin/zxdb/client/job_context.h" |
| #include "garnet/lib/debug_ipc/protocol.h" |
| #include "garnet/public/lib/fxl/macros.h" |
| #include "garnet/public/lib/fxl/memory/weak_ptr.h" |
| |
| namespace zxdb { |
| |
| class JobImpl; |
| class SystemImpl; |
| |
| class JobContextImpl : public JobContext, public SettingStoreObserver { |
| public: |
| // The system owns this object and will outlive it. |
| JobContextImpl(SystemImpl* system, bool is_implicit_component_root); |
| |
| ~JobContextImpl() override; |
| |
| SystemImpl* system() { return system_; } |
| JobImpl* job() { return job_.get(); } |
| |
| // The implicit component root job is one created automatically on |
| // startup that's attached to the component root. This job will be |
| // automatically reconnected if the connect is reconnected. |
| // |
| // If the job is explicitly detached, this flag will be cleared (because the |
| // user is taking responsibility for where it's attached). |
| bool is_implicit_component_root() const { return is_implicit_component_root_; } |
| |
| // Allocates a new job_context with the same settings as this one. This isn't |
| // a real copy, because any job information is not cloned. |
| std::unique_ptr<JobContextImpl> Clone(SystemImpl* system); |
| |
| // Removes the job from this job_context without making any IPC calls. This |
| // can be used to clean up after a CreateJobForTesting(), and during |
| // final shutdown. In final shutdown, we assume anything still left running |
| // will continue running as-is and just clean up local references. |
| // |
| // If the job is not running, this will do nothing. |
| void ImplicitlyDetach(); |
| |
| // JobContext implementation: |
| State GetState() const override; |
| Job* GetJob() const override; |
| void Attach(uint64_t koid, Callback callback) override; |
| void AttachToComponentRoot(Callback callback) override; |
| void Detach(Callback callback) override; |
| |
| // SettingStoreObserver implementation |
| void OnSettingChanged(const SettingStore&, |
| const std::string& setting_name) override; |
| |
| private: |
| SystemImpl* system_; // Owns |this|. |
| |
| State state_ = kNone; |
| |
| // Associated job if there is one. |
| std::unique_ptr<JobImpl> job_; |
| std::vector<std::string> filters_; |
| bool is_implicit_component_root_; |
| |
| fxl::WeakPtrFactory<JobContextImpl> impl_weak_factory_; |
| |
| void AttachInternal(debug_ipc::AttachRequest::Type type, uint64_t koid, |
| Callback callback); |
| |
| static void OnAttachReplyThunk(fxl::WeakPtr<JobContextImpl> job_context, |
| Callback callback, const Err& err, |
| uint64_t koid, uint32_t status, |
| const std::string& job_name); |
| void OnAttachReply(Callback callback, const Err& err, uint64_t koid, |
| uint32_t status, const std::string& job_name); |
| void OnDetachReply(const Err& err, uint32_t status, Callback callback); |
| |
| // If job is running this will update |filters_| only after getting OK from |
| // agent else it will set |filters_| and return. |
| void SendAndUpdateFilters(std::vector<std::string> filters, |
| bool force_send = false); |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(JobContextImpl); |
| }; |
| |
| } // namespace zxdb |
| |
| #endif // GARNET_BIN_ZXDB_CLIENT_JOB_CONTEXT_IMPL_H_ |