libnx/nx/source/kernel/event.c
2018-12-13 22:50:38 +01:00

78 lines
1.6 KiB
C

// Copyright 2018 plutoo
#include "types.h"
#include "result.h"
#include "arm/counter.h"
#include "kernel/svc.h"
#include "kernel/event.h"
#include "kernel/wait.h"
Result eventCreate(Event* t, bool autoclear)
{
Result rc;
rc = svcCreateEvent(&t->wevent, &t->revent);
t->autoclear = autoclear;
if (R_FAILED(rc)) {
t->revent = INVALID_HANDLE;
t->wevent = INVALID_HANDLE;
}
return rc;
}
void eventLoadRemote(Event* t, Handle handle, bool autoclear)
{
t->revent = handle;
t->wevent = INVALID_HANDLE;
t->autoclear = autoclear;
}
Result eventWait(Event* t, u64 timeout)
{
Result rc;
if (t->revent == INVALID_HANDLE)
return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
do {
rc = waitSingleHandle(t->revent, timeout);
if (t->autoclear)
rc = svcResetSignal(t->revent);
} while ((rc & 0x3FFFFF) == 0xFA01);
return rc;
}
Result eventFire(Event* t)
{
if (t->wevent == INVALID_HANDLE)
return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
return svcSignalEvent(t->wevent);
}
Result eventClear(Event* t)
{
if (t->wevent != INVALID_HANDLE)
return svcClearEvent(t->wevent);
if (t->revent != INVALID_HANDLE)
return svcResetSignal(t->revent);
return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);
}
void eventClose(Event* t)
{
if (t->revent != INVALID_HANDLE)
svcCloseHandle(t->revent);
if (t->wevent != INVALID_HANDLE)
svcCloseHandle(t->wevent);
t->revent = INVALID_HANDLE;
t->wevent = INVALID_HANDLE;
}