blob: 0d85acf2610f484dd7d7dab21121e089e5531e1d [file] [log] [blame]
// Copyright 2025 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_PERFORMANCE_MEMORY_THRASHER_LIB_H_
#define SRC_PERFORMANCE_MEMORY_THRASHER_LIB_H_
#include <fidl/fuchsia.fxfs/cpp/fidl.h>
#include <lib/async/dispatcher.h>
#include <lib/fit/function.h>
#include <lib/zx/time.h>
#include <lib/zx/vmo.h>
#include <cstdint>
#include <limits>
#include <memory>
#include <string>
#include <vector>
struct ThrashStatus {
std::string thrasher_type;
uint64_t total_memory_bytes;
uint64_t touches_delta;
uint64_t total_touches;
uint64_t distinct_pages_delta;
zx::duration time_delta;
zx::duration total_time;
};
using ThrashCallback = fit::function<void(std::vector<zx::vmo>)>;
using StatusCallback = fit::function<void(const ThrashStatus&)>;
struct ThrashConfig {
int bursts_per_second = 100;
int run_for_seconds = 60;
int num_threads = 1;
int pages_per_read = 1;
int consecutive_pages_per_read = 1;
async_dispatcher_t* dispatcher;
bool verbose = false;
int status_interval_ms = 1000;
};
// Abstract base class for all thrashers.
class Thrasher {
public:
virtual ~Thrasher() = default;
// Starts asynchronous initialization. Calls |on_initialized| when ready to start.
// |on_initialized| will be called with ZX_OK on success, or an error status on failure.
virtual void Initialize(fit::function<void(zx_status_t)> on_initialized) = 0;
// Starts the actual thrashing workload. Must be called after successful Initialize().
virtual void Start(std::shared_ptr<ThrashCallback> callback,
std::shared_ptr<StatusCallback> status_callback) = 0;
};
// Factory functions for creating specific thrashers.
std::shared_ptr<Thrasher> CreateAnonThrasher(ThrashConfig config, size_t buffer_size_bytes);
std::shared_ptr<Thrasher> CreateMmapThrasher(ThrashConfig config, std::string filename);
std::shared_ptr<Thrasher> CreateDirThrasher(ThrashConfig config, std::string dirname);
std::shared_ptr<Thrasher> CreateBlobThrasher(ThrashConfig config,
const std::vector<std::string>& merkle_roots,
size_t max_blob_size_bytes);
// Exposed for testing
std::shared_ptr<Thrasher> CreateBlobThrasherWithClient(
ThrashConfig config, fidl::ClientEnd<fuchsia_fxfs::BlobReader> blob_reader_client,
const std::vector<std::string>& merkle_roots, size_t max_blob_size_bytes);
void LogVmos(const std::vector<zx::vmo>& vmos, bool verbose);
#endif // SRC_PERFORMANCE_MEMORY_THRASHER_LIB_H_