mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-22 04:52:39 +02:00
wait: Rename UsermodeEvent and UsermodeTimer
This commit is contained in:
parent
376add30a4
commit
eb7d835a79
@ -2,9 +2,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "../kernel/wait.h"
|
#include "../kernel/wait.h"
|
||||||
|
|
||||||
typedef struct UsermodeEvent UsermodeEvent;
|
typedef struct UEvent UEvent;
|
||||||
|
|
||||||
struct UsermodeEvent
|
struct UEvent
|
||||||
{
|
{
|
||||||
Waitable waitable;
|
Waitable waitable;
|
||||||
bool signal;
|
bool signal;
|
||||||
@ -13,19 +13,19 @@ struct UsermodeEvent
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Creates a usermode event.
|
* @brief Creates a usermode event.
|
||||||
* @param[out] e UsermodeEvent object.
|
* @param[out] e UEvent object.
|
||||||
* @param[in] bool auto_clear Whether to automatically clear the event.
|
* @param[in] bool auto_clear Whether to automatically clear the event.
|
||||||
* @note It is safe to wait on this event with several threads simultaneously.
|
* @note It is safe to wait on this event 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.
|
||||||
*/
|
*/
|
||||||
void ueventCreate(UsermodeEvent* e, bool auto_clear);
|
void ueventCreate(UEvent* e, bool auto_clear);
|
||||||
/**
|
/**
|
||||||
* @brief Clears the event signal.
|
* @brief Clears the event signal.
|
||||||
* @param[in] e UsermodeEvent object.
|
* @param[in] e UEvent object.
|
||||||
*/
|
*/
|
||||||
void ueventClear(UsermodeEvent* e);
|
void ueventClear(UEvent* e);
|
||||||
/**
|
/**
|
||||||
* @brief Signals the event.
|
* @brief Signals the event.
|
||||||
* @param[in] e UsermodeEvent object.
|
* @param[in] e UEvent object.
|
||||||
*/
|
*/
|
||||||
void ueventSignal(UsermodeEvent* e);
|
void ueventSignal(UEvent* e);
|
||||||
|
@ -2,14 +2,14 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "../kernel/wait.h"
|
#include "../kernel/wait.h"
|
||||||
|
|
||||||
typedef struct UsermodeTimer UsermodeTimer;
|
typedef struct UTimer UTimer;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TimerType_OneShot,
|
TimerType_OneShot,
|
||||||
TimerType_Repeating
|
TimerType_Repeating
|
||||||
} TimerType;
|
} TimerType;
|
||||||
|
|
||||||
struct UsermodeTimer
|
struct UTimer
|
||||||
{
|
{
|
||||||
Waitable waitable;
|
Waitable waitable;
|
||||||
TimerType type;
|
TimerType type;
|
||||||
@ -19,21 +19,21 @@ struct UsermodeTimer
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Creates a usermode timer.
|
* @brief Creates a usermode timer.
|
||||||
* @param[out] t UsermodeTimer object.
|
* @param[out] t UTimer object.
|
||||||
* @param[in] interval Interval (in nanoseconds).
|
* @param[in] interval Interval (in nanoseconds).
|
||||||
* @param[in] type Timer type (repeating or one-shot)
|
* @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 For a repeating timer: 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, TimerType type);
|
void utimerCreate(UTimer* t, u64 interval, TimerType type);
|
||||||
/**
|
/**
|
||||||
* @brief Starts the timer.
|
* @brief Starts the timer.
|
||||||
* @param[in] t UsermodeTimer object.
|
* @param[in] t UTimer object.
|
||||||
*/
|
*/
|
||||||
void utimerStart(UsermodeTimer* t);
|
void utimerStart(UTimer* t);
|
||||||
/**
|
/**
|
||||||
* @brief Stops the timer.
|
* @brief Stops the timer.
|
||||||
* @param[in] t UsermodeTimer object.
|
* @param[in] t UTimer object.
|
||||||
*/
|
*/
|
||||||
void utimerStop(UsermodeTimer* t);
|
void utimerStop(UTimer* t);
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
#include "../kernel/thread.h"
|
#include "../kernel/thread.h"
|
||||||
|
|
||||||
// Implementation details.
|
// Implementation details.
|
||||||
typedef struct UsermodeEvent UsermodeEvent;
|
typedef struct UEvent UEvent;
|
||||||
typedef struct UsermodeTimer UsermodeTimer;
|
typedef struct UTimer UTimer;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
WaiterNodeType_Event,
|
WaiterNodeType_Event,
|
||||||
@ -28,8 +28,8 @@ typedef struct {
|
|||||||
Handle thread;
|
Handle thread;
|
||||||
union {
|
union {
|
||||||
Waitable* parent;
|
Waitable* parent;
|
||||||
UsermodeEvent* parent_event;
|
UEvent* parent_event;
|
||||||
UsermodeTimer* parent_timer;
|
UTimer* parent_timer;
|
||||||
};
|
};
|
||||||
size_t idx;
|
size_t idx;
|
||||||
size_t* idx_out;
|
size_t* idx_out;
|
||||||
@ -44,8 +44,8 @@ struct Waitable
|
|||||||
// User-facing API starts here.
|
// User-facing API starts here.
|
||||||
typedef enum {
|
typedef enum {
|
||||||
WaiterType_Handle,
|
WaiterType_Handle,
|
||||||
WaiterType_UsermodeTimer,
|
WaiterType_UTimer,
|
||||||
WaiterType_UsermodeEvent,
|
WaiterType_UEvent,
|
||||||
} WaiterType;
|
} WaiterType;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -53,8 +53,8 @@ typedef struct {
|
|||||||
|
|
||||||
union {
|
union {
|
||||||
Handle handle;
|
Handle handle;
|
||||||
UsermodeTimer* timer;
|
UTimer* timer;
|
||||||
UsermodeEvent* event;
|
UEvent* event;
|
||||||
};
|
};
|
||||||
} Waiter;
|
} Waiter;
|
||||||
|
|
||||||
@ -68,19 +68,19 @@ static inline Waiter waiterForHandle(Handle h)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a waiter for a usermode timer.
|
/// Creates a waiter for a usermode timer.
|
||||||
static inline Waiter waiterForUtimer(UsermodeTimer* t)
|
static inline Waiter waiterForUTimer(UTimer* t)
|
||||||
{
|
{
|
||||||
Waiter wait_obj;
|
Waiter wait_obj;
|
||||||
wait_obj.type = WaiterType_UsermodeTimer;
|
wait_obj.type = WaiterType_UTimer;
|
||||||
wait_obj.timer = t;
|
wait_obj.timer = t;
|
||||||
return wait_obj;
|
return wait_obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a waiter for a usermode event.
|
/// Creates a waiter for a usermode event.
|
||||||
static inline Waiter waiterForUevent(UsermodeEvent* e)
|
static inline Waiter waiterForUEvent(UEvent* e)
|
||||||
{
|
{
|
||||||
Waiter wait_obj;
|
Waiter wait_obj;
|
||||||
wait_obj.type = WaiterType_UsermodeEvent;
|
wait_obj.type = WaiterType_UEvent;
|
||||||
wait_obj.event = e;
|
wait_obj.event = e;
|
||||||
return wait_obj;
|
return wait_obj;
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
#include "uevent.h"
|
#include "uevent.h"
|
||||||
|
|
||||||
void ueventCreate(UsermodeEvent* e, bool auto_clear)
|
void ueventCreate(UEvent* e, bool auto_clear)
|
||||||
{
|
{
|
||||||
_waitableInitialize(&e->waitable);
|
_waitableInitialize(&e->waitable);
|
||||||
|
|
||||||
@ -13,14 +13,14 @@ void ueventCreate(UsermodeEvent* e, bool auto_clear)
|
|||||||
e->auto_clear = auto_clear;
|
e->auto_clear = auto_clear;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ueventClear(UsermodeEvent* e)
|
void ueventClear(UEvent* e)
|
||||||
{
|
{
|
||||||
mutexLock(&e->waitable.mutex);
|
mutexLock(&e->waitable.mutex);
|
||||||
e->signal = false;
|
e->signal = false;
|
||||||
mutexUnlock(&e->waitable.mutex);
|
mutexUnlock(&e->waitable.mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ueventSignal(UsermodeEvent* e)
|
void ueventSignal(UEvent* e)
|
||||||
{
|
{
|
||||||
mutexLock(&e->waitable.mutex);
|
mutexLock(&e->waitable.mutex);
|
||||||
e->signal = true;
|
e->signal = true;
|
||||||
@ -28,7 +28,7 @@ void ueventSignal(UsermodeEvent* e)
|
|||||||
mutexUnlock(&e->waitable.mutex);
|
mutexUnlock(&e->waitable.mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _ueventTryAutoClear(UsermodeEvent* e)
|
void _ueventTryAutoClear(UEvent* e)
|
||||||
{
|
{
|
||||||
mutexLock(&e->waitable.mutex);
|
mutexLock(&e->waitable.mutex);
|
||||||
if (e->auto_clear) {
|
if (e->auto_clear) {
|
||||||
@ -37,7 +37,7 @@ void _ueventTryAutoClear(UsermodeEvent* e)
|
|||||||
mutexUnlock(&e->waitable.mutex);
|
mutexUnlock(&e->waitable.mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _ueventAddListener(UsermodeEvent* e, WaiterNode* w, size_t idx, size_t* idx_out, Handle thread)
|
bool _ueventAddListener(UEvent* e, WaiterNode* w, size_t idx, size_t* idx_out, Handle thread)
|
||||||
{
|
{
|
||||||
_waiterNodeCreate(w, WaiterNodeType_Event, &e->waitable, thread, idx, idx_out);
|
_waiterNodeCreate(w, WaiterNodeType_Event, &e->waitable, thread, idx, idx_out);
|
||||||
|
|
||||||
|
@ -2,5 +2,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "kernel/uevent.h"
|
#include "kernel/uevent.h"
|
||||||
|
|
||||||
void _ueventTryAutoClear(UsermodeEvent* e);
|
void _ueventTryAutoClear(UEvent* e);
|
||||||
bool _ueventAddListener(UsermodeEvent* e, WaiterNode* w, size_t idx, size_t* idx_out, Handle thread);
|
bool _ueventAddListener(UEvent* e, WaiterNode* w, size_t idx, size_t* idx_out, Handle thread);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#define STOPPED 0
|
#define STOPPED 0
|
||||||
|
|
||||||
void utimerCreate(UsermodeTimer* t, u64 interval, TimerType type)
|
void utimerCreate(UTimer* t, u64 interval, TimerType type)
|
||||||
{
|
{
|
||||||
_waitableInitialize(&t->waitable);
|
_waitableInitialize(&t->waitable);
|
||||||
|
|
||||||
@ -16,7 +16,7 @@ void utimerCreate(UsermodeTimer* t, u64 interval, TimerType type)
|
|||||||
t->type = type;
|
t->type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
void utimerStart(UsermodeTimer* t)
|
void utimerStart(UTimer* t)
|
||||||
{
|
{
|
||||||
mutexLock(&t->waitable.mutex);
|
mutexLock(&t->waitable.mutex);
|
||||||
|
|
||||||
@ -30,7 +30,7 @@ void utimerStart(UsermodeTimer* t)
|
|||||||
mutexUnlock(&t->waitable.mutex);
|
mutexUnlock(&t->waitable.mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void utimerStop(UsermodeTimer* t)
|
void utimerStop(UTimer* t)
|
||||||
{
|
{
|
||||||
mutexLock(&t->waitable.mutex);
|
mutexLock(&t->waitable.mutex);
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ void utimerStop(UsermodeTimer* t)
|
|||||||
mutexUnlock(&t->waitable.mutex);
|
mutexUnlock(&t->waitable.mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _utimerRecalculate(UsermodeTimer* t, u64 old_tick)
|
void _utimerRecalculate(UTimer* t, u64 old_tick)
|
||||||
{
|
{
|
||||||
mutexLock(&t->waitable.mutex);
|
mutexLock(&t->waitable.mutex);
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ void _utimerRecalculate(UsermodeTimer* t, u64 old_tick)
|
|||||||
mutexUnlock(&t->waitable.mutex);
|
mutexUnlock(&t->waitable.mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 _utimerGetNextTick(UsermodeTimer* t)
|
u64 _utimerGetNextTick(UTimer* t)
|
||||||
{
|
{
|
||||||
u64 ret;
|
u64 ret;
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ u64 _utimerGetNextTick(UsermodeTimer* t)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _utimerAddListener(UsermodeTimer* t, WaiterNode* w, size_t idx, size_t* idx_out, Handle thread)
|
void _utimerAddListener(UTimer* t, WaiterNode* w, size_t idx, size_t* idx_out, Handle thread)
|
||||||
{
|
{
|
||||||
_waiterNodeCreate(w, WaiterNodeType_Timer, &t->waitable, thread, idx, idx_out);
|
_waiterNodeCreate(w, WaiterNodeType_Timer, &t->waitable, thread, idx, idx_out);
|
||||||
|
|
||||||
|
@ -2,6 +2,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "kernel/utimer.h"
|
#include "kernel/utimer.h"
|
||||||
|
|
||||||
void _utimerRecalculate(UsermodeTimer* t, u64 old_tick);
|
void _utimerRecalculate(UTimer* t, u64 old_tick);
|
||||||
u64 _utimerGetNextTick(UsermodeTimer* t);
|
u64 _utimerGetNextTick(UTimer* t);
|
||||||
void _utimerAddListener(UsermodeTimer* t, WaiterNode* w, size_t idx, size_t* idx_out, Handle thread);
|
void _utimerAddListener(UTimer* t, WaiterNode* w, size_t idx, size_t* idx_out, Handle thread);
|
||||||
|
@ -45,7 +45,7 @@ static Result waitImpl(s32* idx_out, Waiter* objects, size_t num_objects, u64 ti
|
|||||||
|
|
||||||
switch (obj->type)
|
switch (obj->type)
|
||||||
{
|
{
|
||||||
case WaiterType_UsermodeTimer:
|
case WaiterType_UTimer:
|
||||||
|
|
||||||
timer_tick = _utimerGetNextTick(obj->timer);
|
timer_tick = _utimerGetNextTick(obj->timer);
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ static Result waitImpl(s32* idx_out, Waiter* objects, size_t num_objects, u64 ti
|
|||||||
num_waiters++;
|
num_waiters++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WaiterType_UsermodeEvent:
|
case WaiterType_UEvent:
|
||||||
|
|
||||||
// Try to add a listener to the event, if it hasn't already signalled.
|
// Try to add a listener to the event, if it hasn't already signalled.
|
||||||
added = _ueventAddListener(
|
added = _ueventAddListener(
|
||||||
|
Loading…
Reference in New Issue
Block a user