blob: 748c2c51bb0a50dc373d40d084b43e3a1b2cf0ce [file] [log] [blame]
// 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.
#include <lib/zx/event.h>
#include <thread>
#include <vector>
#include <perftest/perftest.h>
#include "assert.h"
namespace {
// Helper function that will run in its own thread. Continuously calls get_info
// until told to stop via a shared variable.
void DoHandleValid(std::atomic<bool>* stop, zx::event* event) {
while (!stop->load(std::memory_order_relaxed)) {
ASSERT_OK(event->get_info(ZX_INFO_HANDLE_VALID, nullptr, 0, nullptr, nullptr));
}
}
// Measure how long a simple 'get_info' call takes whilst other cores are doing
// the same. This is measuring the scalability of
// get_info(ZX_INFO_HANDLE_INVALID), particularly the synchronization in the
// kernel on this syscall path.
//
// Should not be invoked with more threads than there are cpus otherwise there
// is a chance with the current scheduler that the main test thread does not get
// to run (or gets to run very sporadically) and makes the test hang (https://fxbug.dev/42106429).
bool HandleValid(perftest::RepeatState* state, uint32_t num_threads) {
// Object so we have a handle to test validity of.
zx::event event;
ASSERT_OK(zx::event::create(0, &event));
// Shared variable for signaling worker threads to stop.
std::atomic<bool> stop(false);
// Create our worker threads.
std::vector<std::thread> threads(num_threads - 1);
for (auto& t : threads) {
t = std::thread(&DoHandleValid, &stop, &event);
}
while (state->KeepRunning()) {
ASSERT_OK(event.get_info(ZX_INFO_HANDLE_VALID, nullptr, 0, nullptr, nullptr));
}
// Inform our worker threads to stop so we can nicely join them.
stop.store(true, std::memory_order_seq_cst);
for (auto& t : threads) {
t.join();
}
return true;
}
void RegisterTests() {
perftest::RegisterTest("HandleValid/1Threads", HandleValid, 1);
perftest::RegisterTest("HandleValid/CpuCountThreads", HandleValid, zx_system_get_num_cpus());
}
PERFTEST_CTOR(RegisterTests)
} // namespace