libnx/nx/include/switch/kernel/utimer.h
2018-12-17 16:18:28 +01:00

59 lines
1.6 KiB
C

/**
* @file utimer.h
* @brief User-mode timer synchronization primitive.
* @author plutoo
* @copyright libnx Authors
*/
#pragma once
#include "wait.h"
typedef struct UTimer UTimer;
/// Valid types for a user-mode timer.
typedef enum {
TimerType_OneShot, ///< Timers of this kind fire once and then stop automatically.
TimerType_Repeating, ///< Timers of this kind fire periodically.
} TimerType;
/// User-mode timer object.
struct UTimer {
Waitable waitable;
TimerType type : 8;
bool started : 1;
u64 next_tick;
u64 interval;
};
/// Creates a waiter for a user-mode timer.
static inline Waiter waiterForUTimer(UTimer* t)
{
Waiter wait_obj;
wait_obj.type = WaiterType_Waitable;
wait_obj.waitable = &t->waitable;
return wait_obj;
}
/**
* @brief Creates a user-mode timer.
* @param[out] t UTimer object.
* @param[in] interval Interval (in nanoseconds).
* @param[in] type Type of timer to create (see \ref TimerType).
* @note The timer is stopped when it is created. Use \ref utimerStart to start it.
* @note It is safe to wait on this timer with several threads simultaneously.
* @note If more than one thread is listening on it, at least one thread will get the signal. No other guarantees.
* @note For a repeating timer: If the timer triggers twice before you wait on it, you will only get one signal.
*/
void utimerCreate(UTimer* t, u64 interval, TimerType type);
/**
* @brief Starts the timer.
* @param[in] t UTimer object.
*/
void utimerStart(UTimer* t);
/**
* @brief Stops the timer.
* @param[in] t UTimer object.
*/
void utimerStop(UTimer* t);