Separate WaiterNode initialization again, which is now done in waitImpl

This commit is contained in:
fincs 2018-12-15 13:50:46 +01:00 committed by fincs
parent a23d38ac77
commit 1d14cad1cf
6 changed files with 18 additions and 16 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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