mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-22 04:52:39 +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;
|
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);
|
mutexLock(&e->waitable.mutex);
|
||||||
|
|
||||||
bool can_add = !e->signal;
|
bool can_add = !e->signal;
|
||||||
|
|
||||||
if (can_add)
|
if (can_add)
|
||||||
_waiterNodeAdd(w, &e->waitable, thread, idx, idx_out);
|
_waiterNodeAdd(w);
|
||||||
else if (e->auto_clear)
|
else if (e->auto_clear)
|
||||||
e->signal = false;
|
e->signal = false;
|
||||||
|
|
||||||
|
@ -4,4 +4,4 @@
|
|||||||
#include "wait.h"
|
#include "wait.h"
|
||||||
|
|
||||||
Result _ueventTryAutoClear(UEvent* e);
|
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;
|
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);
|
mutexLock(&t->waitable.mutex);
|
||||||
_waiterNodeAdd(w, &t->waitable, thread, idx, idx_out);
|
_waiterNodeAdd(w);
|
||||||
mutexUnlock(&t->waitable.mutex);
|
mutexUnlock(&t->waitable.mutex);
|
||||||
}
|
}
|
||||||
|
@ -5,4 +5,4 @@
|
|||||||
|
|
||||||
void _utimerRecalculate(UTimer* t, u64 old_tick);
|
void _utimerRecalculate(UTimer* t, u64 old_tick);
|
||||||
u64 _utimerGetNextTick(UTimer* t);
|
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,
|
// Always add a listener on the timer,
|
||||||
// If the timer is started/stopped we want to detect that.
|
// If the timer is started/stopped we want to detect that.
|
||||||
_utimerAddListener(
|
_waiterNodeInitialize(&waiters[i], &obj->timer->waitable, own_thread_handle, i, &triggered_idx);
|
||||||
obj->timer, &waiters[i], i, &triggered_idx,
|
_utimerAddListener(obj->timer, &waiters[i]);
|
||||||
own_thread_handle);
|
|
||||||
|
|
||||||
waiters_added |= 1UL << i;
|
waiters_added |= 1UL << i;
|
||||||
handles[i] = dummy_handle;
|
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:
|
case WaiterType_UEvent:
|
||||||
// Try to add a listener to the event, if it hasn't already signalled.
|
// Try to add a listener to the event, if it hasn't already signalled.
|
||||||
added = _ueventAddListener(
|
_waiterNodeInitialize(&waiters[i], &obj->event->waitable, own_thread_handle, i, &triggered_idx);
|
||||||
obj->event, &waiters[i], i, &triggered_idx,
|
added = _ueventAddListener(obj->event, &waiters[i]);
|
||||||
own_thread_handle);
|
|
||||||
|
|
||||||
// If the event already happened, we're done.
|
// If the event already happened, we're done.
|
||||||
if (!added) {
|
if (!added) {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
// Copyright 2018 plutoo
|
// Copyright 2018 plutoo
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include "kernel/svc.h"
|
||||||
#include "kernel/mutex.h"
|
#include "kernel/mutex.h"
|
||||||
#include "kernel/wait.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,
|
WaiterNode* w, Waitable* parent, Handle thread,
|
||||||
s32 idx, s32* idx_out)
|
s32 idx, s32* idx_out)
|
||||||
{
|
{
|
||||||
@ -49,11 +50,14 @@ static inline void _waiterNodeAdd(
|
|||||||
w->thread = thread;
|
w->thread = thread;
|
||||||
w->idx = idx;
|
w->idx = idx;
|
||||||
w->idx_out = idx_out;
|
w->idx_out = idx_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void _waiterNodeAdd(WaiterNode* w)
|
||||||
|
{
|
||||||
// Add WaiterNode to the parent's linked list
|
// Add WaiterNode to the parent's linked list
|
||||||
w->node.next = parent->list.next;
|
w->node.next = w->parent->list.next;
|
||||||
parent->list.next = &w->node;
|
w->parent->list.next = &w->node;
|
||||||
w->node.prev = &parent->list;
|
w->node.prev = &w->parent->list;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void _waiterNodeRemove(WaiterNode* w)
|
static inline void _waiterNodeRemove(WaiterNode* w)
|
||||||
|
Loading…
Reference in New Issue
Block a user