// Copyright 2018 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 "logger.h"

#include <lib/syslog/global.h>
#include <zircon/status.h>

namespace syslog {
namespace {

const char* StripDots(const char* path) {
  while (strncmp(path, "../", 3) == 0)
    path += 3;
  return path;
}

const char* StripPath(const char* path) {
  const char* p = strrchr(path, '/');
  if (p)
    return p + 1;
  else
    return path;
}

}  // namespace

namespace internal {

LogMessage::LogMessage(fx_log_severity_t severity, const char* file, int line,
                       const char* tag, zx_status_t status,
                       const char* condition)
    : severity_(severity),
      file_(file),
      line_(line),
      tag_(tag),
      status_(status) {
  stream_ << (severity > FX_LOG_INFO ? StripDots(file_) : StripPath(file_))
          << "(" << line_ << "): ";

  if (condition)
    stream_ << "Check failed: " << condition << ": ";
}

LogMessage::~LogMessage() {
  fx_logger_t* logger = fx_log_get_logger();
  if (logger) {
    if (status_ != INT32_MAX) {
      stream_ << ": " << status_ << " (" << zx_status_get_string(status_)
              << ")";
    }
    fx_logger_log(logger, severity_, tag_, stream_.str().c_str());
  }
}

// Note that this implementation allows a data race on counter_, but
// we consider that harmless because, as specified by the comments on
// FX_LOGS_FIRST_N, we allow for the possibility that the message might get
// logged more than |n| times if a single callsite of that macro is invoked by
// multiple threads.
bool LogFirstNState::ShouldLog(int n) {
  const int32_t counter_value = counter_.load(std::memory_order_relaxed);
  if (counter_value < n) {
    counter_.store(counter_value + 1, std::memory_order_relaxed);
    return true;
  }
  return false;
}

}  // namespace internal
}  // namespace syslog
