kernel: Review comments (move to private interface to private headers, atomics)

This commit is contained in:
plutooo 2018-10-28 17:25:10 +01:00 committed by fincs
parent 9da123f916
commit 26b17cdae5
10 changed files with 34 additions and 20 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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)
{ {

View 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);

View File

@ -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);
} }

View 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);

View File

@ -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)

View File

@ -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
View 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);