diff --git a/include/coreinit/stopwatch.h b/include/coreinit/stopwatch.h new file mode 100644 index 000000000..906c93959 --- /dev/null +++ b/include/coreinit/stopwatch.h @@ -0,0 +1,93 @@ +#pragma once + +#include +#include "spinlock.h" +#include "time.h" + +/** + * \defgroup coreinit_stopwatch Lock-based Stopwatch + * \ingroup coreinit + * + * @{ + */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct OSStopwatch OSStopwatch; + +struct OSStopwatch +{ + //! Lock + OSSpinLock lock; + //! Tag + const char *name; + //! Number of times the stopwatch has been stopped + uint32_t hitCount; + //! Total time from first start to last stop + OSTime totalTime; + //! Minimum time between stops + OSTime minTime; + //! Maximum time between stops + OSTime maxTime; + //! Last time the watch was started + OSTime startTime; + //! Whether the stopwatch is running + BOOL running; + WUT_PADDING_BYTES(0x4); +}; +WUT_CHECK_OFFSET(OSStopwatch, 0x00, lock); +WUT_CHECK_OFFSET(OSStopwatch, 0x10, name); +WUT_CHECK_OFFSET(OSStopwatch, 0x14, hitCount); +WUT_CHECK_OFFSET(OSStopwatch, 0x18, totalTime); +WUT_CHECK_OFFSET(OSStopwatch, 0x20, minTime); +WUT_CHECK_OFFSET(OSStopwatch, 0x28, maxTime); +WUT_CHECK_OFFSET(OSStopwatch, 0x30, startTime); +WUT_CHECK_OFFSET(OSStopwatch, 0x38, running); +WUT_CHECK_SIZE(OSStopwatch, 0x40); + +/** + * Initialises the stopwatch, + * stopwatches must be initialized before any other stopwatch functions are used + */ +void +OSInitStopwatch(OSStopwatch *stopwatch, + const char *name); + +/** + * Resets all stopwatch data + */ +void +OSResetStopwatch(OSStopwatch *stopwatch); + +/** + * Starts the stopwatch. + * if already started, will update the start time without resetting the total time + */ +void +OSStartStopwatch(OSStopwatch *stopwatch); + +/** + * Stops the stopwatch and increments hit count. + * Nothing happens if the stopwatch has already been stopped + */ +void +OSStopStopwatch(OSStopwatch *stopwatch); + +/** + * Returns the total time the stopwatch has been running + */ +OSTime +OSCheckStopwatch(OSStopwatch *stopwatch); + +/** + * Dumps stopwatch info to the Cafe OS warn log + */ +void +OSDumpStopwatch(OSStopwatch *stopwatch); + +#ifdef __cplusplus +} +#endif + +/** @} */ diff --git a/include/coreinit/stopwatchatomic.h b/include/coreinit/stopwatchatomic.h new file mode 100644 index 000000000..7368df322 --- /dev/null +++ b/include/coreinit/stopwatchatomic.h @@ -0,0 +1,65 @@ +#pragma once + +#include +#include "time.h" + +/** + * \defgroup coreinit_stopwatchatomic Atomic Stopwatch + * \ingroup coreinit + * + * @{ + */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct OSStopWatchAtomic OSStopWatchAtomic; + +struct OSStopWatchAtomic +{ + //! Last time the watch was started + OSTime startTime; + //! Total time from first start to last stop + OSTime totalTime; +}; +WUT_CHECK_OFFSET(OSStopWatchAtomic, 0x00, startTime); +WUT_CHECK_OFFSET(OSStopWatchAtomic, 0x08, totalTime); +WUT_CHECK_SIZE(OSStopWatchAtomic, 0x10); + +/** + * Start the stopwatch. + * Only updates the start time + * \returns total time on stopwatch + */ +OSTime +OSStopWatchStart(OSStopWatchAtomic *stopWatch); + +/** + * Stop the stopwatch. + * Resets the start time to 0 + * \returns total time on stopwatch + */ +OSTime +OSStopWatchStop(OSStopWatchAtomic *stopWatch); + +/** + * Get the current time on the stopwatch + * \returns current time on stopwatch + */ +OSTime +OSStopWatchLap(OSStopWatchAtomic *stopWatch); + + +/** + * Stops and resets the stop watch. + * Clears start and total time + * \returns previous total time + */ +OSTime +OSStopWatchReset(OSStopWatchAtomic *stopWatch); + +#ifdef __cplusplus +} +#endif + +/** @} */ diff --git a/tests/test_compile_headers_common/test_compile_headers_list.h b/tests/test_compile_headers_common/test_compile_headers_list.h index 6a15035eb..e44d0afff 100644 --- a/tests/test_compile_headers_common/test_compile_headers_list.h +++ b/tests/test_compile_headers_common/test_compile_headers_list.h @@ -51,6 +51,8 @@ #include #include #include +#include +#include #include #include #include