|
|
/*++
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; }
|