blob: 55d54af3fc00fe43994b3b7bf7d1b7ec4ea1b2c6 [file] [log] [blame]
// Copyright 2019 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 <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/trace-provider/provider.h>
#include <zircon/compiler.h>
#include <thread>
__BEGIN_CDECLS
void trace_provider_create_with_fdio_rust() __attribute__((visibility("default")));
__END_CDECLS
// The C++ trace provider API depends on libasync. Create a new thread here
// to run a libasync loop here to host that trace provider.
//
// This is intended to be a temporary solution until we have a proper rust
// trace-provider implementation.
static void trace_provider_with_fdio_thread_entry() {
async::Loop loop(&kAsyncLoopConfigNoAttachToCurrentThread);
trace::TraceProviderWithFdio trace_provider(loop.dispatcher());
loop.Run();
}
// Detaches the loop cleanly for shutdown. A thread must be either detached, or
// joined before it is destroyed.
class LoopShutdown {
public:
explicit LoopShutdown(std::function<void()> f) : thread_(std::make_unique<std::thread>(f)) {}
~LoopShutdown() { thread_->detach(); }
private:
std::unique_ptr<std::thread> thread_;
};
void trace_provider_create_with_fdio_rust() {
// Keep a reference to the thread to make LSAN happy. At the same time, ensures exactly-once
// semantics in C++11 and beyond.
static const auto trace_provider_thread =
std::make_unique<LoopShutdown>(&trace_provider_with_fdio_thread_entry);
}