/** Check the status of an event. @param UserEvent The event to check @retval EFI_SUCCESS The event is in the signaled state @retval EFI_NOT_READY The event is not in the signaled state @retval EFI_INVALID_PARAMETER Event is of type EVT_NOTIFY_SIGNAL **/ EFI_STATUS EFIAPI CoreCheckEvent ( IN EFI_EVENT UserEvent ) { IEVENT *Event; EFI_STATUS Status; Event = UserEvent; if (Event == NULL) { return EFI_INVALID_PARAMETER; } if (Event->Signature != EVENT_SIGNATURE) { return EFI_INVALID_PARAMETER; } if ((Event->Type & EVT_NOTIFY_SIGNAL) != 0) { return EFI_INVALID_PARAMETER; } Status = EFI_NOT_READY; if ((Event->SignalCount == 0) && ((Event->Type & EVT_NOTIFY_WAIT) != 0)) { // // Queue the wait notify function // CoreAcquireEventLock (); if (Event->SignalCount == 0) { CoreNotifyEvent (Event); } CoreReleaseEventLock (); } // // If the even looks signalled, get the lock and clear it // if (Event->SignalCount != 0) { CoreAcquireEventLock (); if (Event->SignalCount != 0) { Event->SignalCount = 0; Status = EFI_SUCCESS; } CoreReleaseEventLock (); } return Status; }
/** Signals the event. Queues the event to be notified if needed. @param UserEvent The event to signal . @retval EFI_INVALID_PARAMETER Parameters are not valid. @retval EFI_SUCCESS The event was signaled. **/ EFI_STATUS EFIAPI CoreSignalEvent ( IN EFI_EVENT UserEvent ) { IEVENT *Event; Event = UserEvent; if (Event == NULL) { return EFI_INVALID_PARAMETER; } if (Event->Signature != EVENT_SIGNATURE) { return EFI_INVALID_PARAMETER; } CoreAcquireEventLock (); // // If the event is not already signalled, do so // if (Event->SignalCount == 0x00000000) { Event->SignalCount++; // // If signalling type is a notify function, queue it // if ((Event->Type & EVT_NOTIFY_SIGNAL) != 0) { if (Event->ExFlag) { // // The CreateEventEx() style requires all members of the Event Group // to be signaled. // CoreReleaseEventLock (); CoreNotifySignalList (&Event->EventGroup); CoreAcquireEventLock (); } else { CoreNotifyEvent (Event); } } } CoreReleaseEventLock (); return EFI_SUCCESS; }
/** Signals all events in the EventGroup. @param EventGroup The list to signal **/ VOID CoreNotifySignalList ( IN EFI_GUID *EventGroup ) { LIST_ENTRY *Link; LIST_ENTRY *Head; IEVENT *Event; CoreAcquireEventLock (); Head = &gEventSignalQueue; for (Link = Head->ForwardLink; Link != Head; Link = Link->ForwardLink) { Event = CR (Link, IEVENT, SignalLink, EVENT_SIGNATURE); if (CompareGuid (&Event->EventGroup, EventGroup)) { CoreNotifyEvent (Event); } } CoreReleaseEventLock (); }
VOID CoreNotifySignalList ( IN EFI_GUID *EventGroup ) /*++ Routine Description: Signals all events on the requested list Arguments: SignalType - The list to signal Returns: None --*/ { EFI_LIST_ENTRY *Link; EFI_LIST_ENTRY *Head; IEVENT *Event; CoreAcquireEventLock (); Head = &gEventSignalQueue; for (Link = Head->ForwardLink; Link != Head; Link = Link->ForwardLink) { Event = CR (Link, IEVENT, SignalLink, EVENT_SIGNATURE); if ((Event->ExFlag) && EfiCompareGuid (&Event->EventGroup, EventGroup)) { CoreNotifyEvent (Event); } } CoreReleaseEventLock (); }
EFI_BOOTSERVICE EFI_STATUS EFIAPI CoreCheckEvent ( IN EFI_EVENT UserEvent ) /*++ Routine Description: Check the status of an event Arguments: UserEvent - The event to check Returns: EFI_SUCCESS - The event is in the signaled state EFI_NOT_READY - The event is not in the signaled state EFI_INVALID_PARAMETER - Event is of type EVT_NOTIFY_SIGNAL --*/ { IEVENT *Event; EFI_STATUS Status; Event = UserEvent; if (Event == NULL) { return EFI_INVALID_PARAMETER; } if (Event->Signature != EVENT_SIGNATURE) { return EFI_INVALID_PARAMETER; } if (Event->Type & EFI_EVENT_NOTIFY_SIGNAL) { return EFI_INVALID_PARAMETER; } Status = EFI_NOT_READY; if (!Event->SignalCount && (Event->Type & EFI_EVENT_NOTIFY_WAIT)) { // // Queue the wait notify function // CoreAcquireEventLock (); if (!Event->SignalCount) { CoreNotifyEvent (Event); } CoreReleaseEventLock (); } // // If the even looks signalled, get the lock and clear it // if (Event->SignalCount) { CoreAcquireEventLock (); if (Event->SignalCount) { Event->SignalCount = 0; Status = EFI_SUCCESS; } CoreReleaseEventLock (); } return Status; }
EFI_BOOTSERVICE EFI_STATUS EFIAPI CoreSignalEvent ( IN EFI_EVENT UserEvent ) /*++ Routine Description: Signals the event. Queues the event to be notified if needed Arguments: UserEvent - The event to signal Returns: EFI_INVALID_PARAMETER - Parameters are not valid. EFI_SUCCESS - The event was signaled. --*/ { IEVENT *Event; Event = UserEvent; if (Event == NULL) { return EFI_INVALID_PARAMETER; } if (Event->Signature != EVENT_SIGNATURE) { return EFI_INVALID_PARAMETER; } CoreAcquireEventLock (); // // If the event is not already signalled, do so // if (Event->SignalCount == 0x00000000) { Event->SignalCount ++; // // If signalling type is a notify function, queue it // if (Event->Type & EFI_EVENT_NOTIFY_SIGNAL) { if (Event->ExFlag) { // // The CreateEventEx() style requires all members of the Event Group // to be signaled. // CoreReleaseEventLock (); CoreNotifySignalList (&Event->EventGroup); CoreAcquireEventLock (); } else { CoreNotifyEvent (Event); } } } CoreReleaseEventLock (); return EFI_SUCCESS; }