From 26b17cdae5d695409bb89da0935ba738d574a598 Mon Sep 17 00:00:00 2001 From: plutooo Date: Sun, 28 Oct 2018 17:25:10 +0100 Subject: [PATCH] kernel: Review comments (move to private interface to private headers, atomics) --- nx/include/switch/kernel/uevent.h | 5 ----- nx/include/switch/kernel/utimer.h | 4 ---- nx/include/switch/kernel/waiter.h | 7 ------- nx/source/kernel/uevent.c | 1 + nx/source/kernel/uevent.h | 7 +++++++ nx/source/kernel/utimer.c | 9 +++++---- nx/source/kernel/utimer.h | 6 ++++++ nx/source/kernel/wait.c | 3 +++ nx/source/kernel/waiter.c | 2 ++ nx/source/kernel/waiter.h | 10 ++++++++++ 10 files changed, 34 insertions(+), 20 deletions(-) create mode 100644 nx/source/kernel/uevent.h create mode 100644 nx/source/kernel/utimer.h create mode 100644 nx/source/kernel/waiter.h diff --git a/nx/include/switch/kernel/uevent.h b/nx/include/switch/kernel/uevent.h index e231cf22..07ce828d 100644 --- a/nx/include/switch/kernel/uevent.h +++ b/nx/include/switch/kernel/uevent.h @@ -16,8 +16,3 @@ struct UsermodeEvent void ueventCreate(UsermodeEvent* e, bool auto_clear); void ueventClear(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); diff --git a/nx/include/switch/kernel/utimer.h b/nx/include/switch/kernel/utimer.h index 6134b504..4282c976 100644 --- a/nx/include/switch/kernel/utimer.h +++ b/nx/include/switch/kernel/utimer.h @@ -13,7 +13,3 @@ struct UsermodeTimer void utimerCreate(UsermodeTimer* t, u64 interval, bool start); void utimerStart(UsermodeTimer* t); void utimerStop(UsermodeTimer* t); - -// Internal methods (do not use!): -void _utimerRecalculate(UsermodeTimer* t, u64 old_time); -u64 _utimerGetNextTime(UsermodeTimer* t); diff --git a/nx/include/switch/kernel/waiter.h b/nx/include/switch/kernel/waiter.h index ec67357a..eee7b8eb 100644 --- a/nx/include/switch/kernel/waiter.h +++ b/nx/include/switch/kernel/waiter.h @@ -26,10 +26,3 @@ struct Waiter WaiterNode nodes[MAX_WAIT]; 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); diff --git a/nx/source/kernel/uevent.c b/nx/source/kernel/uevent.c index e2c5f20f..3dcedb00 100644 --- a/nx/source/kernel/uevent.c +++ b/nx/source/kernel/uevent.c @@ -3,6 +3,7 @@ #include "kernel/mutex.h" #include "kernel/waiter.h" #include "kernel/uevent.h" +#include "waiter.h" void ueventCreate(UsermodeEvent* e, bool auto_clear) { diff --git a/nx/source/kernel/uevent.h b/nx/source/kernel/uevent.h new file mode 100644 index 00000000..62d108d0 --- /dev/null +++ b/nx/source/kernel/uevent.h @@ -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); diff --git a/nx/source/kernel/utimer.c b/nx/source/kernel/utimer.c index 28515cfc..7e775657 100644 --- a/nx/source/kernel/utimer.c +++ b/nx/source/kernel/utimer.c @@ -14,22 +14,23 @@ void utimerCreate(UsermodeTimer* t, u64 interval, bool start) 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) { - 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) { s64 interval = t->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) { - return t->next_time; + return __atomic_load_n(&t->next_time, __ATOMIC_SEQ_CST); } diff --git a/nx/source/kernel/utimer.h b/nx/source/kernel/utimer.h new file mode 100644 index 00000000..1e21afe9 --- /dev/null +++ b/nx/source/kernel/utimer.h @@ -0,0 +1,6 @@ +// Copyright 2018 plutoo +#pragma once +#include "kernel/utimer.h" + +void _utimerRecalculate(UsermodeTimer* t, u64 old_time); +u64 _utimerGetNextTime(UsermodeTimer* t); diff --git a/nx/source/kernel/wait.c b/nx/source/kernel/wait.c index 0279b892..ee5536f2 100644 --- a/nx/source/kernel/wait.c +++ b/nx/source/kernel/wait.c @@ -6,6 +6,9 @@ #include "kernel/utimer.h" #include "kernel/uevent.h" #include "arm/counter.h" +#include "waiter.h" +#include "utimer.h" +#include "uevent.h" #include "../internal.h" Result waitN(s32* idx_out, WaitObject* objects, size_t num_objects, u64 timeout) diff --git a/nx/source/kernel/waiter.c b/nx/source/kernel/waiter.c index ef678480..f59b986b 100644 --- a/nx/source/kernel/waiter.c +++ b/nx/source/kernel/waiter.c @@ -1,6 +1,8 @@ // Copyright 2018 plutoo #include "kernel/waiter.h" #include "kernel/uevent.h" +#include "waiter.h" +#include "uevent.h" #include "../internal.h" #define NOT_YET_SIGNALLED (-1) diff --git a/nx/source/kernel/waiter.h b/nx/source/kernel/waiter.h new file mode 100644 index 00000000..acab7fb9 --- /dev/null +++ b/nx/source/kernel/waiter.h @@ -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); +