mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 20:42:44 +02:00
utimer: Add TimerType_OneShot
This commit is contained in:
parent
0c0261bf2f
commit
68b4d323a0
@ -4,9 +4,15 @@
|
|||||||
|
|
||||||
typedef struct UsermodeTimer UsermodeTimer;
|
typedef struct UsermodeTimer UsermodeTimer;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TimerType_OneShot,
|
||||||
|
TimerType_Repeating
|
||||||
|
} TimerType;
|
||||||
|
|
||||||
struct UsermodeTimer
|
struct UsermodeTimer
|
||||||
{
|
{
|
||||||
Waitable waitable;
|
Waitable waitable;
|
||||||
|
TimerType type;
|
||||||
u64 next_tick;
|
u64 next_tick;
|
||||||
u64 interval;
|
u64 interval;
|
||||||
};
|
};
|
||||||
@ -15,12 +21,12 @@ struct UsermodeTimer
|
|||||||
* @brief Creates a usermode timer.
|
* @brief Creates a usermode timer.
|
||||||
* @param[out] t UsermodeTimer object.
|
* @param[out] t UsermodeTimer object.
|
||||||
* @param[in] interval Interval (in nanoseconds).
|
* @param[in] interval Interval (in nanoseconds).
|
||||||
* @param[in] start Whether to start the timer right away.
|
* @param[in] type Timer type (repeating or one-shot)
|
||||||
* @note It is safe to wait on this timer with several threads simultaneously.
|
* @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 If more than one thread is listening on it, at least one thread will get the signal. No other guarantees.
|
||||||
* @note If the timer triggers twice before you wait on it, you will only get one signal.
|
* @note For a repeating timer: If the timer triggers twice before you wait on it, you will only get one signal.
|
||||||
*/
|
*/
|
||||||
void utimerCreate(UsermodeTimer* t, u64 interval, bool start);
|
void utimerCreate(UsermodeTimer* t, u64 interval, TimerType type);
|
||||||
/**
|
/**
|
||||||
* @brief Starts the timer.
|
* @brief Starts the timer.
|
||||||
* @param[in] t UsermodeTimer object.
|
* @param[in] t UsermodeTimer object.
|
||||||
|
@ -32,7 +32,7 @@ void _ueventTryAutoClear(UsermodeEvent* e)
|
|||||||
{
|
{
|
||||||
mutexLock(&e->waitable.mutex);
|
mutexLock(&e->waitable.mutex);
|
||||||
if (e->auto_clear) {
|
if (e->auto_clear) {
|
||||||
e->signal = true;
|
e->signal = false;
|
||||||
}
|
}
|
||||||
mutexUnlock(&e->waitable.mutex);
|
mutexUnlock(&e->waitable.mutex);
|
||||||
}
|
}
|
||||||
|
@ -7,15 +7,13 @@
|
|||||||
|
|
||||||
#define STOPPED 0
|
#define STOPPED 0
|
||||||
|
|
||||||
void utimerCreate(UsermodeTimer* t, u64 interval, bool start)
|
void utimerCreate(UsermodeTimer* t, u64 interval, TimerType type)
|
||||||
{
|
{
|
||||||
_waitableInitialize(&t->waitable);
|
_waitableInitialize(&t->waitable);
|
||||||
|
|
||||||
t->next_tick = STOPPED;
|
t->next_tick = STOPPED;
|
||||||
t->interval = armNsToTicks(interval);
|
t->interval = armNsToTicks(interval);
|
||||||
|
t->type = type;
|
||||||
if (start)
|
|
||||||
utimerStart(t);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void utimerStart(UsermodeTimer* t)
|
void utimerStart(UsermodeTimer* t)
|
||||||
@ -52,7 +50,17 @@ void _utimerRecalculate(UsermodeTimer* t, u64 old_tick)
|
|||||||
if (t->next_tick == old_tick)
|
if (t->next_tick == old_tick)
|
||||||
{
|
{
|
||||||
u64 interval = t->interval;
|
u64 interval = t->interval;
|
||||||
u64 new_tick = old_tick + ((svcGetSystemTick() - old_tick + interval - 1)/interval)*interval;
|
u64 new_tick = 0;
|
||||||
|
|
||||||
|
switch (t->type)
|
||||||
|
{
|
||||||
|
case TimerType_OneShot:
|
||||||
|
new_tick = STOPPED;
|
||||||
|
break;
|
||||||
|
case TimerType_Repeating:
|
||||||
|
new_tick = old_tick + ((svcGetSystemTick() - old_tick + interval - 1)/interval)*interval;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
t->next_tick = new_tick;
|
t->next_tick = new_tick;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user