// Copyright 2018 plutoo
#pragma once
#include "../types.h"
#include "../result.h"
#include "wait.h"

typedef struct {
    Handle revent;
    Handle wevent;
    bool autoclear;
} Event;

/// Creates a \ref Waiter for a kernel-mode event.
static inline Waiter waiterForEvent(Event* t)
{
    Waiter wait_obj;
    wait_obj.type = t->autoclear ? WaiterType_HandleWithClear : WaiterType_Handle;
    wait_obj.handle = t->revent;
    return wait_obj;
}

Result eventCreate(Event* t, bool autoclear);
void   eventLoadRemote(Event* t, Handle handle, bool autoclear);
void   eventClose(Event* t);

/// Returns whether the Event is initialized.
static inline bool eventActive(Event* t)
{
    return t->revent != INVALID_HANDLE;
}

Result eventWait(Event* t, u64 timeout);
Result eventFire(Event* t);
Result eventClear(Event* t);