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; |
} |
|