| // Copyright 2018 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 <vector> | |
| #include <fbl/string_printf.h> | |
| #include <lib/zx/timer.h> | |
| #include <perftest/perftest.h> | |
| namespace { | |
| struct TimerState { | |
| zx::duration wait_time; | |
| zx::duration slack_time; | |
| }; | |
| const char* SlackTypeToString(uint32_t slack_type) { | |
| switch (slack_type) { | |
| case ZX_TIMER_SLACK_LATE: | |
| return "SlackLate"; | |
| case ZX_TIMER_SLACK_EARLY: | |
| return "SlackEarly"; | |
| case ZX_TIMER_SLACK_CENTER: | |
| return "SlackCenter"; | |
| default: | |
| ZX_ASSERT_MSG(true, "Slack type unsupported\n"); | |
| return nullptr; | |
| } | |
| } | |
| // Measures how long a timer takes to fire based on the wait time, slack time, | |
| // and slack type. This can be useful for measuring the overhead of sleeping. | |
| // It can also be used to measure the variation in actual sleep times. | |
| bool TimerWaitTest(perftest::RepeatState* state, TimerState timer_state, uint32_t slack_type) { | |
| zx_status_t status; | |
| zx::timer timer; | |
| status = zx::timer::create(slack_type, ZX_CLOCK_MONOTONIC, &timer); | |
| ZX_ASSERT(status == ZX_OK); | |
| while (state->KeepRunning()) { | |
| status = timer.set(zx::deadline_after(timer_state.wait_time), timer_state.slack_time); | |
| ZX_ASSERT(status == ZX_OK); | |
| zx_status_t status = timer.wait_one(ZX_TIMER_SIGNALED, zx::time::infinite(), nullptr); | |
| ZX_ASSERT(status == ZX_OK); | |
| } | |
| return true; | |
| } | |
| void RegisterTests() { | |
| const TimerState timers[] = {TimerState{zx::msec(1), zx::usec(0)}, | |
| TimerState{zx::msec(1), zx::usec(500)}}; | |
| const uint32_t slack_types[] = {ZX_TIMER_SLACK_LATE, ZX_TIMER_SLACK_EARLY, ZX_TIMER_SLACK_CENTER}; | |
| for (auto timer : timers) { | |
| for (auto slack_type : slack_types) { | |
| auto name = fbl::StringPrintf("Timer/%lumsWait/%s%luus", timer.wait_time.to_msecs(), | |
| SlackTypeToString(slack_type), timer.slack_time.to_usecs()); | |
| perftest::RegisterTest(name.c_str(), TimerWaitTest, timer, slack_type); | |
| } | |
| } | |
| } | |
| PERFTEST_CTOR(RegisterTests) | |
| } // namespace |