blob: 98906cb86750904dd0f83648ddcba5b82137e727 [file] [log] [blame]
// Copyright 2024 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 "src/devices/bin/driver_runtime/message_packet.h"
#include <lib/fdf/cpp/arena.h>
#include <lib/syslog/cpp/macros.h>
#include <fbl/string_printf.h>
#include <perftest/perftest.h>
#include "src/devices/bin/driver_runtime/driver_context.h"
#include "src/devices/bin/driver_runtime/microbenchmarks/assert.h"
namespace {
// Measure the time taken to allocate and free a message packet
// which holds a buffer of |buffer_size| and an array of |num_handles|.
bool MessagePacketCreateDestroyTest(perftest::RepeatState* state, uint32_t buffer_size,
uint32_t num_handles) {
state->DeclareStep("setup");
state->DeclareStep("create");
state->DeclareStep("destroy");
state->DeclareStep("teardown");
while (state->KeepRunning()) {
// Setup the arena, data, and handle buffers to pass to the message packet.
constexpr uint32_t kTag = 'BNCH';
fdf::Arena arena(kTag);
void* data = arena.Allocate(buffer_size);
auto handles_buf = static_cast<zx_handle_t*>(arena.Allocate(num_handles * sizeof(zx_handle_t)));
for (uint32_t i = 0; i < num_handles; i++) {
// Ownership of the handle is passed to the message packet.
zx_handle_t event;
ASSERT_OK(zx_event_create(0, &event));
handles_buf[i] = event;
}
// The internal |MessagePacket| API expects a ref ptr.
fbl::RefPtr<fdf_arena> arena_ref(arena.get());
{
state->NextStep();
driver_runtime::MessagePacketOwner msg_packet = driver_runtime::MessagePacket::Create(
arena_ref, data, buffer_size, handles_buf, num_handles);
state->NextStep();
// The msg_packet and included handles will be automatically destroyed.
}
state->NextStep();
}
return true;
}
void RegisterTests() {
static const unsigned kBufferSize[] = {
0,
64,
};
static const unsigned kNumHandles[] = {
0,
1,
};
for (auto buffer_size : kBufferSize) {
for (auto num_handles : kNumHandles) {
auto name = fbl::StringPrintf("MessagePacket/CreateDestroy/%ubytes/%uhandles", buffer_size,
num_handles);
perftest::RegisterTest(name.c_str(), MessagePacketCreateDestroyTest, buffer_size,
num_handles);
}
}
}
PERFTEST_CTOR(RegisterTests)
} // namespace