| // 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_ |