| // Copyright 2013 The Flutter 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 "flutter/fml/platform/fuchsia/log_state.h" |
| |
| #include <fidl/fuchsia.logger/cpp/fidl.h> |
| #include <lib/component/incoming/cpp/protocol.h> |
| #include <lib/fidl/cpp/channel.h> |
| #include <lib/fidl/cpp/wire/internal/transport_channel.h> |
| #include <lib/zx/socket.h> |
| #include <zircon/assert.h> |
| #include <zircon/types.h> |
| |
| #include <atomic> |
| #include <initializer_list> |
| #include <memory> |
| #include <mutex> |
| #include <string> |
| #include <utility> |
| #include <vector> |
| |
| #include "flutter/fml/platform/fuchsia/log_interest_listener.h" |
| |
| namespace fml { |
| |
| LogState::LogState() { |
| // Get channel to log sink |
| auto client_end = component::Connect<fuchsia_logger::LogSink>(); |
| ZX_ASSERT(client_end.is_ok()); |
| fidl::SyncClient log_sink(std::move(*client_end)); |
| |
| // Attempts to create a kernel socket object should never fail. |
| zx::socket local, remote; |
| zx::socket::create(ZX_SOCKET_DATAGRAM, &local, &remote); |
| auto result = log_sink->ConnectStructured({{.socket = std::move(remote)}}); |
| ZX_ASSERT_MSG(result.is_ok(), "%s", |
| result.error_value().FormatDescription().c_str()); |
| |
| // Wait for the first interest change to set the initial minimum logging |
| // level (should return quickly). |
| auto interest_result = log_sink->WaitForInterestChange(); |
| ZX_ASSERT_MSG(interest_result.is_ok(), "%s", |
| interest_result.error_value().FormatDescription().c_str()); |
| LogInterestListener::HandleInterestChange(interest_result->data()); |
| |
| socket_ = std::move(local); |
| client_end_ = log_sink.TakeClientEnd(); |
| } |
| |
| fidl::ClientEnd<::fuchsia_logger::LogSink> LogState::TakeClientEnd() { |
| std::lock_guard lock(mutex_); |
| return std::move(client_end_); |
| } |
| |
| void LogState::SetTags(const std::initializer_list<std::string>& tags) { |
| std::atomic_store(&tags_, |
| std::make_shared<const std::vector<std::string>>(tags)); |
| } |
| |
| LogState& LogState::Default() { |
| static LogState* instance = new LogState(); |
| return *instance; |
| } |
| |
| } // namespace fml |