libnx/nx/source/kernel/wait.h
2018-12-17 16:06:23 +01:00

53 lines
1.2 KiB
C

// Copyright 2018 plutoo
#pragma once
#include "kernel/mutex.h"
#include "kernel/wait.h"
static inline void _waitableInitialize(Waitable* ww)
{
mutexInit(&ww->mutex);
ww->list.next = &ww->list;
ww->list.prev = &ww->list;
}
static inline void _waitableSignalAllListeners(Waitable* ww)
{
WaitableNode* node = &ww->list;
WaitableNode* end = node;
while (node->next != end)
{
node = node->next;
WaiterNode* w = (WaiterNode*) node;
*w->idx_out = w->idx;
svcCancelSynchronization(w->thread);
}
}
static inline void _waiterNodeInitialize(
WaiterNode* w, WaiterNodeType type, Waitable* parent, Handle thread,
size_t idx, size_t* idx_out)
{
w->type = type;
w->parent = parent;
w->thread = thread;
w->idx = idx;
w->idx_out = idx_out;
}
static inline void _waiterNodeAddToWaitable(WaiterNode* w, Waitable* ww)
{
w->node.next = ww->list.next;
ww->list.next = &w->node;
w->node.prev = &ww->list;
}
static inline void _waiterNodeFree(WaiterNode* w)
{
mutexLock(&w->parent->mutex);
w->node.prev->next = w->node.next;
w->node.next->prev = w->node.prev;
mutexUnlock(&w->parent->mutex);
}