blob: c27286df3d935f1a5079d2a821ee782bfd5762ab [file] [log] [blame]
// Copyright 2016 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_TRACE_MANAGER_TRACE_MANAGER_H_
#define GARNET_BIN_TRACE_MANAGER_TRACE_MANAGER_H_
#include <fuchsia/tracing/controller/cpp/fidl.h>
#include <fuchsia/tracing/provider/cpp/fidl.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/fidl/cpp/interface_ptr_set.h>
#include <lib/fidl/cpp/interface_request.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/zx/socket.h>
#include <list>
#include <queue>
#include "garnet/bin/trace_manager/config.h"
#include "garnet/bin/trace_manager/trace_provider_bundle.h"
#include "garnet/bin/trace_manager/trace_session.h"
namespace tracing {
namespace controller = ::fuchsia::tracing::controller;
namespace provider = ::fuchsia::tracing::provider;
// forward decl, here to break mutual header dependency
class TraceManagerApp;
class TraceManager : public controller::Controller, public provider::Registry {
public:
TraceManager(TraceManagerApp* app, sys::ComponentContext* context, Config config);
~TraceManager() override;
// For testing.
const TraceSession* session() const { return session_.get(); }
void OnEmptyControllerSet();
private:
// |Controller| implementation.
void InitializeTracing(controller::TraceConfig config, zx::socket output) override;
void TerminateTracing(controller::TerminateOptions options, TerminateTracingCallback cb) override;
void StartTracing(controller::StartOptions options, StartTracingCallback cb) override;
void StopTracing(controller::StopOptions options, StopTracingCallback cb) override;
void GetProviders(GetProvidersCallback cb) override;
void GetKnownCategories(GetKnownCategoriesCallback callback) override;
void WatchAlert(WatchAlertCallback cb) override;
// |TraceRegistry| implementation.
void RegisterProviderWorker(fidl::InterfaceHandle<provider::Provider> provider, uint64_t pid,
fidl::StringPtr name);
void RegisterProvider(fidl::InterfaceHandle<provider::Provider> provider, uint64_t pid,
std::string name) override;
void RegisterProviderSynchronously(fidl::InterfaceHandle<provider::Provider> provider,
uint64_t pid, std::string name,
RegisterProviderSynchronouslyCallback callback) override;
void SendSessionStateEvent(controller::SessionState state);
controller::SessionState TranslateSessionState(TraceSession::State state);
void LaunchConfiguredProviders();
void OnAlert(const std::string& alert_name);
TraceManagerApp* const app_;
// Non-owning copy of component context. |TraceManagerApp| has the owning
// copy, but we need it too. This works out ok as |TraceManagerApp| owns us.
sys::ComponentContext* const context_;
const Config config_;
uint32_t next_provider_id_ = 1u;
fxl::RefPtr<TraceSession> session_;
std::list<TraceProviderBundle> providers_;
std::queue<std::string> alerts_;
std::queue<WatchAlertCallback> watch_alert_callbacks_;
TraceManager(const TraceManager&) = delete;
TraceManager(TraceManager&&) = delete;
TraceManager& operator=(const TraceManager&) = delete;
TraceManager& operator=(TraceManager&&) = delete;
};
} // namespace tracing
#endif // GARNET_BIN_TRACE_MANAGER_TRACE_MANAGER_H_