From 1d14cad1cf8b8fbf89b5c571a87f193e08abf119 Mon Sep 17 00:00:00 2001 From: fincs Date: Sat, 15 Dec 2018 13:50:46 +0100 Subject: [PATCH] Separate WaiterNode initialization again, which is now done in waitImpl --- nx/source/kernel/uevent.c | 4 ++-- nx/source/kernel/uevent.h | 2 +- nx/source/kernel/utimer.c | 4 ++-- nx/source/kernel/utimer.h | 2 +- nx/source/kernel/wait.c | 10 ++++------ nx/source/kernel/wait.h | 12 ++++++++---- 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/nx/source/kernel/uevent.c b/nx/source/kernel/uevent.c index 64c9b31a..0407ac53 100644 --- a/nx/source/kernel/uevent.c +++ b/nx/source/kernel/uevent.c @@ -42,14 +42,14 @@ Result _ueventTryAutoClear(UEvent* e) return rc; } -bool _ueventAddListener(UEvent* e, WaiterNode* w, s32 idx, s32* idx_out, Handle thread) +bool _ueventAddListener(UEvent* e, WaiterNode* w) { mutexLock(&e->waitable.mutex); bool can_add = !e->signal; if (can_add) - _waiterNodeAdd(w, &e->waitable, thread, idx, idx_out); + _waiterNodeAdd(w); else if (e->auto_clear) e->signal = false; diff --git a/nx/source/kernel/uevent.h b/nx/source/kernel/uevent.h index e9c79b5b..7881f8e1 100644 --- a/nx/source/kernel/uevent.h +++ b/nx/source/kernel/uevent.h @@ -4,4 +4,4 @@ #include "wait.h" Result _ueventTryAutoClear(UEvent* e); -bool _ueventAddListener(UEvent* e, WaiterNode* w, s32 idx, s32* idx_out, Handle thread); +bool _ueventAddListener(UEvent* e, WaiterNode* w); diff --git a/nx/source/kernel/utimer.c b/nx/source/kernel/utimer.c index 93b321f9..95089d4e 100644 --- a/nx/source/kernel/utimer.c +++ b/nx/source/kernel/utimer.c @@ -74,9 +74,9 @@ u64 _utimerGetNextTick(UTimer* t) return ret; } -void _utimerAddListener(UTimer* t, WaiterNode* w, s32 idx, s32* idx_out, Handle thread) +void _utimerAddListener(UTimer* t, WaiterNode* w) { mutexLock(&t->waitable.mutex); - _waiterNodeAdd(w, &t->waitable, thread, idx, idx_out); + _waiterNodeAdd(w); mutexUnlock(&t->waitable.mutex); } diff --git a/nx/source/kernel/utimer.h b/nx/source/kernel/utimer.h index 2606184b..c4497608 100644 --- a/nx/source/kernel/utimer.h +++ b/nx/source/kernel/utimer.h @@ -5,4 +5,4 @@ void _utimerRecalculate(UTimer* t, u64 old_tick); u64 _utimerGetNextTick(UTimer* t); -void _utimerAddListener(UTimer* t, WaiterNode* w, s32 idx, s32* idx_out, Handle thread); +void _utimerAddListener(UTimer* t, WaiterNode* w); diff --git a/nx/source/kernel/wait.c b/nx/source/kernel/wait.c index 5a2f7d46..a61639e8 100644 --- a/nx/source/kernel/wait.c +++ b/nx/source/kernel/wait.c @@ -72,9 +72,8 @@ static Result waitImpl(s32* idx_out, Waiter* objects, size_t num_objects, u64 ti // Always add a listener on the timer, // If the timer is started/stopped we want to detect that. - _utimerAddListener( - obj->timer, &waiters[i], i, &triggered_idx, - own_thread_handle); + _waiterNodeInitialize(&waiters[i], &obj->timer->waitable, own_thread_handle, i, &triggered_idx); + _utimerAddListener(obj->timer, &waiters[i]); waiters_added |= 1UL << i; handles[i] = dummy_handle; @@ -82,9 +81,8 @@ static Result waitImpl(s32* idx_out, Waiter* objects, size_t num_objects, u64 ti case WaiterType_UEvent: // Try to add a listener to the event, if it hasn't already signalled. - added = _ueventAddListener( - obj->event, &waiters[i], i, &triggered_idx, - own_thread_handle); + _waiterNodeInitialize(&waiters[i], &obj->event->waitable, own_thread_handle, i, &triggered_idx); + added = _ueventAddListener(obj->event, &waiters[i]); // If the event already happened, we're done. if (!added) { diff --git a/nx/source/kernel/wait.h b/nx/source/kernel/wait.h index 6cfc5176..4c17586e 100644 --- a/nx/source/kernel/wait.h +++ b/nx/source/kernel/wait.h @@ -1,5 +1,6 @@ // Copyright 2018 plutoo #pragma once +#include "kernel/svc.h" #include "kernel/mutex.h" #include "kernel/wait.h" @@ -40,7 +41,7 @@ static inline void _waitableSignalAllListeners(Waitable* ww) } } -static inline void _waiterNodeAdd( +static inline void _waiterNodeInitialize( WaiterNode* w, Waitable* parent, Handle thread, s32 idx, s32* idx_out) { @@ -49,11 +50,14 @@ static inline void _waiterNodeAdd( w->thread = thread; w->idx = idx; w->idx_out = idx_out; +} +static inline void _waiterNodeAdd(WaiterNode* w) +{ // Add WaiterNode to the parent's linked list - w->node.next = parent->list.next; - parent->list.next = &w->node; - w->node.prev = &parent->list; + w->node.next = w->parent->list.next; + w->parent->list.next = &w->node; + w->node.prev = &w->parent->list; } static inline void _waiterNodeRemove(WaiterNode* w)