Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2725 → Rev 2726

/trunk/boot/arch/ia64/loader/gefi/lib/event.c
0,0 → 1,149
/*++
 
Copyright (c) 1998 Intel Corporation
 
Module Name:
 
event.c
 
Abstract:
 
 
 
 
Revision History
 
--*/
 
#include "lib.h"
 
 
EFI_EVENT
LibCreateProtocolNotifyEvent (
IN EFI_GUID *ProtocolGuid,
IN EFI_TPL NotifyTpl,
IN EFI_EVENT_NOTIFY NotifyFunction,
IN VOID *NotifyContext,
OUT VOID *Registration
)
{
EFI_STATUS Status;
EFI_EVENT Event;
 
//
// Create the event
//
 
Status = BS->CreateEvent (
EVT_NOTIFY_SIGNAL,
NotifyTpl,
NotifyFunction,
NotifyContext,
&Event
);
ASSERT (!EFI_ERROR(Status));
 
//
// Register for protocol notifactions on this event
//
 
Status = BS->RegisterProtocolNotify (
ProtocolGuid,
Event,
Registration
);
 
ASSERT (!EFI_ERROR(Status));
 
//
// Kick the event so we will perform an initial pass of
// current installed drivers
//
 
BS->SignalEvent (Event);
return Event;
}
 
 
EFI_STATUS
WaitForSingleEvent (
IN EFI_EVENT Event,
IN UINT64 Timeout OPTIONAL
)
{
EFI_STATUS Status;
UINTN Index;
EFI_EVENT TimerEvent;
EFI_EVENT WaitList[2];
 
if (Timeout) {
//
// Create a timer event
//
 
Status = BS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);
if (!EFI_ERROR(Status)) {
 
//
// Set the timer event
//
 
BS->SetTimer (TimerEvent, TimerRelative, Timeout);
//
// Wait for the original event or the timer
//
 
WaitList[0] = Event;
WaitList[1] = TimerEvent;
Status = BS->WaitForEvent (2, WaitList, &Index);
BS->CloseEvent (TimerEvent);
 
//
// If the timer expired, change the return to timed out
//
 
if (!EFI_ERROR(Status) && Index == 1) {
Status = EFI_TIMEOUT;
}
}
 
} else {
 
//
// No timeout... just wait on the event
//
 
Status = BS->WaitForEvent (1, &Event, &Index);
ASSERT (!EFI_ERROR(Status));
ASSERT (Index == 0);
}
 
return Status;
}
 
VOID
WaitForEventWithTimeout (
IN EFI_EVENT Event,
IN UINTN Timeout,
IN UINTN Row,
IN UINTN Column,
IN CHAR16 *String,
IN EFI_INPUT_KEY TimeoutKey,
OUT EFI_INPUT_KEY *Key
)
{
EFI_STATUS Status;
 
do {
PrintAt (Column, Row, String, Timeout);
Status = WaitForSingleEvent (Event, 10000000);
if (Status == EFI_SUCCESS) {
if (!EFI_ERROR(ST->ConIn->ReadKeyStroke (ST->ConIn, Key))) {
return;
}
}
} while (Timeout > 0);
*Key = TimeoutKey;
}