blob: 4eb971e2ccad0967d687543cfa73482eac803c78 [file] [log] [blame]
// 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_