mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-23 13:22:40 +02:00
kernel: Review comments (move to private interface to private headers, atomics)
This commit is contained in:
parent
9da123f916
commit
26b17cdae5
@ -16,8 +16,3 @@ struct UsermodeEvent
|
|||||||
void ueventCreate(UsermodeEvent* e, bool auto_clear);
|
void ueventCreate(UsermodeEvent* e, bool auto_clear);
|
||||||
void ueventClear(UsermodeEvent* e);
|
void ueventClear(UsermodeEvent* e);
|
||||||
void ueventSignal(UsermodeEvent* e);
|
void ueventSignal(UsermodeEvent* e);
|
||||||
|
|
||||||
// Internal methods (do not use!):
|
|
||||||
bool _ueventConsumeIfSignalled(UsermodeEvent* e);
|
|
||||||
void _ueventAddListener(UsermodeEvent* e, WaiterNode* w);
|
|
||||||
void _ueventRemoveListener(UsermodeEvent* e, WaiterNode* w);
|
|
||||||
|
@ -13,7 +13,3 @@ struct UsermodeTimer
|
|||||||
void utimerCreate(UsermodeTimer* t, u64 interval, bool start);
|
void utimerCreate(UsermodeTimer* t, u64 interval, bool start);
|
||||||
void utimerStart(UsermodeTimer* t);
|
void utimerStart(UsermodeTimer* t);
|
||||||
void utimerStop(UsermodeTimer* t);
|
void utimerStop(UsermodeTimer* t);
|
||||||
|
|
||||||
// Internal methods (do not use!):
|
|
||||||
void _utimerRecalculate(UsermodeTimer* t, u64 old_time);
|
|
||||||
u64 _utimerGetNextTime(UsermodeTimer* t);
|
|
||||||
|
@ -26,10 +26,3 @@ struct Waiter
|
|||||||
WaiterNode nodes[MAX_WAIT];
|
WaiterNode nodes[MAX_WAIT];
|
||||||
size_t num_nodes;
|
size_t num_nodes;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Internal methods (do not use!):
|
|
||||||
void _waiterCreate(Waiter* w);
|
|
||||||
void _waiterFree(Waiter* w, WaitObject* objects);
|
|
||||||
void _waiterSubscribe(Waiter* w, UsermodeEvent* e);
|
|
||||||
bool _waiterSignal(Waiter* w, s32 idx);
|
|
||||||
s32 _waiterGetSignalledIndex(Waiter* w);
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "kernel/mutex.h"
|
#include "kernel/mutex.h"
|
||||||
#include "kernel/waiter.h"
|
#include "kernel/waiter.h"
|
||||||
#include "kernel/uevent.h"
|
#include "kernel/uevent.h"
|
||||||
|
#include "waiter.h"
|
||||||
|
|
||||||
void ueventCreate(UsermodeEvent* e, bool auto_clear)
|
void ueventCreate(UsermodeEvent* e, bool auto_clear)
|
||||||
{
|
{
|
||||||
|
7
nx/source/kernel/uevent.h
Normal file
7
nx/source/kernel/uevent.h
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
// Copyright 2018 plutoo
|
||||||
|
#pragma once
|
||||||
|
#include "kernel/uevent.h"
|
||||||
|
|
||||||
|
bool _ueventConsumeIfSignalled(UsermodeEvent* e);
|
||||||
|
void _ueventAddListener(UsermodeEvent* e, WaiterNode* w);
|
||||||
|
void _ueventRemoveListener(UsermodeEvent* e, WaiterNode* w);
|
@ -14,22 +14,23 @@ void utimerCreate(UsermodeTimer* t, u64 interval, bool start)
|
|||||||
|
|
||||||
void utimerStart(UsermodeTimer* t)
|
void utimerStart(UsermodeTimer* t)
|
||||||
{
|
{
|
||||||
__sync_bool_compare_and_swap(&t->next_time, 0, armGetSystemTick() + armNsToTick(t->interval));
|
u64 zero = 0;
|
||||||
|
__atomic_compare_exchange_n(&t->next_time, &zero, armGetSystemTick() + armNsToTick(t->interval), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
|
||||||
}
|
}
|
||||||
|
|
||||||
void utimerStop(UsermodeTimer* t)
|
void utimerStop(UsermodeTimer* t)
|
||||||
{
|
{
|
||||||
while (__sync_bool_compare_and_swap(&t->next_time, t->next_time, 0));
|
while (!__atomic_compare_exchange_n(&t->next_time, &t->next_time, 0, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _utimerRecalculate(UsermodeTimer* t, u64 old_time)
|
void _utimerRecalculate(UsermodeTimer* t, u64 old_time)
|
||||||
{
|
{
|
||||||
s64 interval = t->interval;
|
s64 interval = t->interval;
|
||||||
s64 new_time = ((armGetSystemTick() - old_time + interval - 1) / interval) * interval;
|
s64 new_time = ((armGetSystemTick() - old_time + interval - 1) / interval) * interval;
|
||||||
__sync_bool_compare_and_swap(&t->next_time, old_time, new_time);
|
__atomic_compare_exchange_n(&t->next_time, &old_time, new_time, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 _utimerGetNextTime(UsermodeTimer* t)
|
u64 _utimerGetNextTime(UsermodeTimer* t)
|
||||||
{
|
{
|
||||||
return t->next_time;
|
return __atomic_load_n(&t->next_time, __ATOMIC_SEQ_CST);
|
||||||
}
|
}
|
||||||
|
6
nx/source/kernel/utimer.h
Normal file
6
nx/source/kernel/utimer.h
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// Copyright 2018 plutoo
|
||||||
|
#pragma once
|
||||||
|
#include "kernel/utimer.h"
|
||||||
|
|
||||||
|
void _utimerRecalculate(UsermodeTimer* t, u64 old_time);
|
||||||
|
u64 _utimerGetNextTime(UsermodeTimer* t);
|
@ -6,6 +6,9 @@
|
|||||||
#include "kernel/utimer.h"
|
#include "kernel/utimer.h"
|
||||||
#include "kernel/uevent.h"
|
#include "kernel/uevent.h"
|
||||||
#include "arm/counter.h"
|
#include "arm/counter.h"
|
||||||
|
#include "waiter.h"
|
||||||
|
#include "utimer.h"
|
||||||
|
#include "uevent.h"
|
||||||
#include "../internal.h"
|
#include "../internal.h"
|
||||||
|
|
||||||
Result waitN(s32* idx_out, WaitObject* objects, size_t num_objects, u64 timeout)
|
Result waitN(s32* idx_out, WaitObject* objects, size_t num_objects, u64 timeout)
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
// Copyright 2018 plutoo
|
// Copyright 2018 plutoo
|
||||||
#include "kernel/waiter.h"
|
#include "kernel/waiter.h"
|
||||||
#include "kernel/uevent.h"
|
#include "kernel/uevent.h"
|
||||||
|
#include "waiter.h"
|
||||||
|
#include "uevent.h"
|
||||||
#include "../internal.h"
|
#include "../internal.h"
|
||||||
|
|
||||||
#define NOT_YET_SIGNALLED (-1)
|
#define NOT_YET_SIGNALLED (-1)
|
||||||
|
10
nx/source/kernel/waiter.h
Normal file
10
nx/source/kernel/waiter.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// Copyright 2018 plutoo
|
||||||
|
#pragma once
|
||||||
|
#include "kernel/waiter.h"
|
||||||
|
|
||||||
|
void _waiterCreate(Waiter* w);
|
||||||
|
void _waiterFree(Waiter* w, WaitObject* objects);
|
||||||
|
void _waiterSubscribe(Waiter* w, UsermodeEvent* e);
|
||||||
|
bool _waiterSignal(Waiter* w, s32 idx);
|
||||||
|
s32 _waiterGetSignalledIndex(Waiter* w);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user