blob: 627874fc74f578fcad1d45dde512b4c10d0993e5 [file] [log] [blame]
// Copyright 2017 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.
#include "zircon_platform_trace.h"
#include <memory>
#include <lib/fit/function.h>
#include "magma_util/dlog.h"
#include "magma_util/macros.h"
namespace magma {
#if MAGMA_ENABLE_TRACING
static std::unique_ptr<ZirconPlatformTrace> g_platform_trace;
ZirconPlatformTrace::ZirconPlatformTrace()
: loop_(&kAsyncLoopConfigNoAttachToThread), trace_provider_(loop_.dispatcher())
{
}
bool ZirconPlatformTrace::Initialize()
{
zx_status_t status = loop_.StartThread();
if (status != ZX_OK)
return DRETF(false, "Failed to start async loop");
return true;
}
PlatformTrace* PlatformTrace::Get()
{
if (!g_platform_trace)
g_platform_trace = std::make_unique<ZirconPlatformTrace>();
return g_platform_trace.get();
}
ZirconPlatformTraceObserver::ZirconPlatformTraceObserver()
: loop_(&kAsyncLoopConfigNoAttachToThread)
{
}
bool ZirconPlatformTraceObserver::Initialize()
{
zx_status_t status = loop_.StartThread();
if (status != ZX_OK)
return DRETF(false, "Failed to start async loop");
return true;
}
void ZirconPlatformTraceObserver::SetObserver(fit::function<void(bool)> callback)
{
observer_.Stop();
enabled_ = false;
observer_.Start(loop_.dispatcher(), [this, callback = std::move(callback)] {
bool enabled = trace_state() == TRACE_STARTED;
if (this->enabled_ != enabled) {
this->enabled_ = enabled;
callback(enabled);
}
});
}
// static
std::unique_ptr<PlatformTraceObserver> PlatformTraceObserver::Create()
{
auto observer = std::make_unique<ZirconPlatformTraceObserver>();
if (!observer->Initialize())
return nullptr;
return observer;
}
#else
PlatformTrace* PlatformTrace::Get() { return nullptr; }
#endif
// static
uint64_t PlatformTrace::GetCurrentTicks() { return zx_ticks_get(); }
} // namespace magma