mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 20:42:44 +02:00
Separate WaiterNode initialization again, which is now done in waitImpl
This commit is contained in:
parent
a23d38ac77
commit
1d14cad1cf
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user