// Copyright 2019 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 SRC_TESTING_LOADBENCH_UTILITY_H_
#define SRC_TESTING_LOADBENCH_UTILITY_H_

#include <lib/zx/profile.h>
#include <lib/zx/resource.h>
#include <lib/zx/time.h>
#include <zircon/syscalls/object.h>
#include <zircon/syscalls/profile.h>

#include <chrono>
#include <cstddef>
#include <optional>
#include <string>

using double_seconds = std::chrono::duration<double, std::chrono::seconds::period>;
using double_nanoseconds = std::chrono::duration<double, std::chrono::nanoseconds::period>;

// Parses a duration in string form, which may include the units m, s, ms, us, or ns, and returns
// the equivalent value in nanoseconds.
std::chrono::nanoseconds ParseDurationString(const std::string& duration);

// Parses an expression of the form "cpu_num<+|-|*><positive integer>" and returns evaluated result
// as an integer.
size_t ParseInstancesString(const std::string& instances_str);

// Returns an unowned handle to a profile for the specified priority. Maintains
// an internal map of already requested profiles and returns the same handle for
// multiple requests for the same priority.
zx::unowned_profile GetProfile(int priority, std::optional<zx_cpu_set_t> affinity = std::nullopt);

// Returns an unowned handle to a profile for the specified deadline parameters.
// Maintains an internal map of already requested profiles and returns the same
// handle for multiple request for the same deadline parameters.
zx::unowned_profile GetProfile(zx::duration capacity, zx::duration deadline, zx::duration period,
                               std::optional<zx_cpu_set_t> affinity = std::nullopt);

// Returns an unowned handle to the root resource. Mantains an internal handle and returns the same
// value for multiple requests.
zx::unowned_resource GetDebugResource();

// Returns the number of CPUs in the system.
size_t ReadCpuCount();

// Reads the CPU stats for the given number of CPUs.
void ReadCpuStats(zx_info_cpu_stats_t* stats_buffer, size_t record_count);

#endif  // SRC_TESTING_LOADBENCH_UTILITY_H_
