// Copyright 2017 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.

#ifndef GARNET_LIB_PERFMON_EVENTS_H_
#define GARNET_LIB_PERFMON_EVENTS_H_

#include <memory>
#include <stdint.h>
#include <string>
#include <vector>

#include <lib/zircon-internal/device/cpu-trace/perf-mon.h>

namespace perfmon {

// TODO(dje): Reconcile event SYMBOLs with event names.
// Ideally they should match, but there's also good reasons
// to keep them different (organization, and matching vendor docs).
// TODO(dje): Add missing event descriptions. See perfmon --list-events.

struct EventDetails {
  EventId id;
  // All these pointers point to storage of static duration.
  const char* name;
  const char* readable_name;
  const char* description;
};

// At the outer level, events are grouped by model: The client selects the
// set of events that are available for the particular model being used.

class ModelEventManager {
 public:
  // Register events for |group_name| for model |model_name|.
  // |events| points to storage of static duration. |model_name,group_name| do
  // not need to point to storage of static duration.
  // This may be called multiple times to register more events for the same
  // model,group. Event names must all be unique, newer events don't replace
  // previously registered events of the same name.
  // This function is not thread-safe.
  static void RegisterEvents(const char* model_name, const char* group_name,
                             const EventDetails* events, size_t count);

  // This function is not thread-safe.
  static std::unique_ptr<ModelEventManager> Create(const std::string& model_name);

  using EventTable = std::vector<const EventDetails*>;

  struct GroupEvents {
    // Within each model's set of events, events are organized into groups:
    // arch, fixed, model, misc.
    std::string group_name;

    EventTable events;
  };

  using GroupTable = std::vector<GroupEvents>;

  const std::string& model_name() const { return model_name_; }

  // Look up the event details for event |id|.
  // Returns true if |id| is valid, otherwise false.
  // This function is thread-safe.
  // TODO(dje): Rename to LookupEventById.
  bool EventIdToEventDetails(EventId id, const EventDetails** out_details) const;

  // Look up the event details for event |event_name| in group |group_name|.
  // Returns true if |id| is valid, otherwise false.
  // This function is thread-safe.
  bool LookupEventByName(const char* group_name, const char* event_name,
                         const EventDetails** out_details) const;

  // Return set of all supported events.
  // The result is an unsorted vector of vectors, one vector of events per
  // group.
  // This function is thread-safe.
  GroupTable GetAllGroups() const;

  // For debugging.
  void Dump() const;

 private:
  ModelEventManager(const std::string& model_name, const EventTable* arch_events,
                    const EventTable* fixed_events, const EventTable* model_events,
                    const EventTable* misc_events);

  void DumpGroup(const char* name, const EventTable* events) const;

  const std::string model_name_;

  // These point to pre-constructed tables.
  // They are never null but the tables may be empty.
  const EventTable* const arch_events_;
  const EventTable* const fixed_events_;
  const EventTable* const model_events_;
  const EventTable* const misc_events_;
};

// Pass this to |ModelEventManager::Create()| to get the default model for the
// current system.
// Returns "" if the default model is unknown (e.g., on unsupported arch).
std::string GetDefaultModelName();

}  // namespace perfmon

#endif  // GARNET_LIB_PERFMON_EVENTS_H_
