blob: 6c2014e72f13c80a2c65eb46499a5a6578e1dccb [file] [log] [blame]
// Copyright 2020 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 "sdk/lib/syslog/cpp/logging_backend_fuchsia_globals.h"
#include <zircon/assert.h>
#include <zircon/process.h>
#include <zircon/syscalls.h>
#include <atomic>
#define EXPORT __attribute__((visibility("default")))
namespace {
std::atomic<uint32_t> dropped_count = std::atomic<uint32_t>(0);
std::atomic<syslog_backend::LogState*> state = nullptr;
// This thread's koid.
// Initialized on first use.
thread_local zx_koid_t tls_thread_koid{ZX_KOID_INVALID};
zx_koid_t GetKoid(zx_handle_t handle) {
zx_info_handle_basic_t info;
zx_status_t status =
zx_object_get_info(handle, ZX_INFO_HANDLE_BASIC, &info, sizeof(info), nullptr, nullptr);
return status == ZX_OK ? info.koid : ZX_KOID_INVALID;
}
} // namespace
extern "C" {
EXPORT
zx_koid_t GetCurrentThreadKoid() {
if (unlikely(tls_thread_koid == ZX_KOID_INVALID)) {
tls_thread_koid = GetKoid(zx_thread_self());
}
ZX_DEBUG_ASSERT(tls_thread_koid != ZX_KOID_INVALID);
return tls_thread_koid;
}
EXPORT
syslog_backend::LogState* SetState(syslog_backend::LogState* new_state) {
return state.exchange(new_state);
}
EXPORT
syslog_backend::LogState* GetState() { return state.load(); }
EXPORT
uint32_t GetAndResetDropped() { return dropped_count.exchange(0, std::memory_order_relaxed); }
EXPORT
void AddDropped(uint32_t count) { dropped_count.fetch_add(count, std::memory_order_relaxed); }
} // extern "C"