Skip to content

Commit

Permalink
coreinit: add stopwatch.h and stopwatchatomic.h (#370)
Browse files Browse the repository at this point in the history
* coreinit: add stopwatch.h and stopwatchatomic.h

* Formatting

* correct function name
  • Loading branch information
capitalistspz authored Jun 8, 2024
1 parent ef057f1 commit 1da1402
Show file tree
Hide file tree
Showing 3 changed files with 160 additions and 0 deletions.
93 changes: 93 additions & 0 deletions include/coreinit/stopwatch.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
#pragma once

#include <wut.h>
#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

/** @} */
65 changes: 65 additions & 0 deletions include/coreinit/stopwatchatomic.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#pragma once

#include <wut.h>
#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

/** @} */
2 changes: 2 additions & 0 deletions tests/test_compile_headers_common/test_compile_headers_list.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@
#include <coreinit/semaphore.h>
#include <coreinit/smd.h>
#include <coreinit/spinlock.h>
#include <coreinit/stopwatch.h>
#include <coreinit/stopwatchatomic.h>
#include <coreinit/systeminfo.h>
#include <coreinit/taskqueue.h>
#include <coreinit/thread.h>
Expand Down

0 comments on commit 1da1402

Please sign in to comment.