// Copyright 2020 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#ifndef ZIRCON_KERNEL_LIB_DEBUGLOG_DEBUGLOG_INTERNAL_H_
#define ZIRCON_KERNEL_LIB_DEBUGLOG_DEBUGLOG_INTERNAL_H_

#include <lib/zircon-internal/thread_annotations.h>

#include <kernel/event.h>
#include <kernel/mutex.h>
#include <kernel/spinlock.h>
#include <ktl/string_view.h>

#define DLOG_SIZE (128u * 1024u)
#define DLOG_MASK (DLOG_SIZE - 1u)

#define ALIGN4_TRUNC(n) ((n) & (~3))
#define ALIGN4(n) ALIGN4_TRUNC(((n) + 3))

struct DLog {
  explicit constexpr DLog() {}

  zx_status_t write(uint32_t severity, uint32_t flags, ktl::string_view str);

  // Mark this DLog as being shutdown.  Once called, subsequent |write| operations will fail.
  void shutdown();

  DECLARE_SPINLOCK(DLog) lock;

  size_t head TA_GUARDED(lock) = 0;
  size_t tail TA_GUARDED(lock) = 0;

  // Indicates that the system has begun to panic.  When true, |write| will immediately return an
  // error.
  bool panic = false;

  AutounsignalEvent event;

  DECLARE_LOCK(DLog, Mutex) readers_lock;
  fbl::DoublyLinkedList<DlogReader*> readers TA_GUARDED(readers_lock);

 private:
  // A counter incremented for each log message that enters the debuglog.
  uint64_t sequence_count TA_GUARDED(lock) = 0;

  // Indicates that this |DLog| object is being shutdown.  When true, |write| will immediately
  // return an error.
  bool shutdown_requested_ TA_GUARDED(lock) = false;

 public:
  uint8_t data[DLOG_SIZE]{0};
};

#endif  // ZIRCON_KERNEL_LIB_DEBUGLOG_DEBUGLOG_INTERNAL_H_
