mirror of https://github.com/acidanthera/audk.git
Close the corresponding GUIDed section extraction protocol notify event in CloseSectionStream.
Signed-off-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Chao Zhang <chao.b.zhang@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13563 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
b90aefa9e4
commit
805c2dd119
|
@ -75,6 +75,11 @@ typedef struct {
|
||||||
//
|
//
|
||||||
UINTN EncapsulatedStreamHandle;
|
UINTN EncapsulatedStreamHandle;
|
||||||
EFI_GUID *EncapsulationGuid;
|
EFI_GUID *EncapsulationGuid;
|
||||||
|
//
|
||||||
|
// If the section REQUIRES an extraction protocol, register for RPN
|
||||||
|
// when the required GUIDed extraction protocol becomes available.
|
||||||
|
//
|
||||||
|
EFI_EVENT Event;
|
||||||
} FRAMEWORK_SECTION_CHILD_NODE;
|
} FRAMEWORK_SECTION_CHILD_NODE;
|
||||||
|
|
||||||
#define FRAMEWORK_SECTION_STREAM_SIGNATURE SIGNATURE_32('S','X','S','S')
|
#define FRAMEWORK_SECTION_STREAM_SIGNATURE SIGNATURE_32('S','X','S','S')
|
||||||
|
@ -100,7 +105,6 @@ typedef struct {
|
||||||
FRAMEWORK_SECTION_CHILD_NODE *ChildNode;
|
FRAMEWORK_SECTION_CHILD_NODE *ChildNode;
|
||||||
FRAMEWORK_SECTION_STREAM_NODE *ParentStream;
|
FRAMEWORK_SECTION_STREAM_NODE *ParentStream;
|
||||||
VOID *Registration;
|
VOID *Registration;
|
||||||
EFI_EVENT Event;
|
|
||||||
} RPN_EVENT_CONTEXT;
|
} RPN_EVENT_CONTEXT;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -602,12 +606,13 @@ NotifyGuidedExtraction (
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// If above, the stream did not close successfully, it indicates it's
|
// If above, the stream did not close successfully, it indicates it's
|
||||||
// alread been closed by someone, so just destroy the event and be done with
|
// already been closed by someone, so just destroy the event and be done with
|
||||||
// it.
|
// it.
|
||||||
//
|
//
|
||||||
|
|
||||||
gBS->CloseEvent (Event);
|
gBS->CloseEvent (Event);
|
||||||
|
Context->ChildNode->Event = NULL;
|
||||||
FreePool (Context);
|
FreePool (Context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -636,14 +641,14 @@ CreateGuidedExtractionRpnEvent (
|
||||||
Context->ChildNode = ChildNode;
|
Context->ChildNode = ChildNode;
|
||||||
Context->ParentStream = ParentStream;
|
Context->ParentStream = ParentStream;
|
||||||
|
|
||||||
Context->Event = CreateProtocolNotifyEvent (
|
Context->ChildNode->Event = CreateProtocolNotifyEvent (
|
||||||
Context->ChildNode->EncapsulationGuid,
|
Context->ChildNode->EncapsulationGuid,
|
||||||
TPL_NOTIFY,
|
TPL_NOTIFY,
|
||||||
NotifyGuidedExtraction,
|
NotifyGuidedExtraction,
|
||||||
Context,
|
Context,
|
||||||
&Context->Registration,
|
&Context->Registration,
|
||||||
FALSE
|
FALSE
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -695,7 +700,7 @@ CreateChildNode (
|
||||||
//
|
//
|
||||||
// Allocate a new node
|
// Allocate a new node
|
||||||
//
|
//
|
||||||
*ChildNode = AllocatePool (sizeof (FRAMEWORK_SECTION_CHILD_NODE));
|
*ChildNode = AllocateZeroPool (sizeof (FRAMEWORK_SECTION_CHILD_NODE));
|
||||||
Node = *ChildNode;
|
Node = *ChildNode;
|
||||||
if (Node == NULL) {
|
if (Node == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
@ -1045,6 +1050,7 @@ FindChildNode (
|
||||||
CurrentChildNode = CHILD_SECTION_NODE_FROM_LINK (GetFirstNode(&SourceStream->Children));
|
CurrentChildNode = CHILD_SECTION_NODE_FROM_LINK (GetFirstNode(&SourceStream->Children));
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
ASSERT (CurrentChildNode != NULL);
|
||||||
if (ChildIsType (SourceStream, CurrentChildNode, SearchType, SectionDefinitionGuid)) {
|
if (ChildIsType (SourceStream, CurrentChildNode, SearchType, SectionDefinitionGuid)) {
|
||||||
//
|
//
|
||||||
// The type matches, so check the instance count to see if it's the one we want
|
// The type matches, so check the instance count to see if it's the one we want
|
||||||
|
@ -1061,7 +1067,6 @@ FindChildNode (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT (CurrentChildNode != NULL);
|
|
||||||
if (CurrentChildNode->EncapsulatedStreamHandle != NULL_STREAM_HANDLE) {
|
if (CurrentChildNode->EncapsulatedStreamHandle != NULL_STREAM_HANDLE) {
|
||||||
//
|
//
|
||||||
// If the current node is an encapsulating node, recurse into it...
|
// If the current node is an encapsulating node, recurse into it...
|
||||||
|
@ -1339,6 +1344,11 @@ FreeChildNode (
|
||||||
//
|
//
|
||||||
CloseSectionStream (&mSectionExtraction, ChildNode->EncapsulatedStreamHandle);
|
CloseSectionStream (&mSectionExtraction, ChildNode->EncapsulatedStreamHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ChildNode->Event != NULL) {
|
||||||
|
gBS->CloseEvent (ChildNode->Event);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Last, free the child node itself
|
// Last, free the child node itself
|
||||||
//
|
//
|
||||||
|
|
|
@ -66,6 +66,11 @@ typedef struct {
|
||||||
//
|
//
|
||||||
UINTN EncapsulatedStreamHandle;
|
UINTN EncapsulatedStreamHandle;
|
||||||
EFI_GUID *EncapsulationGuid;
|
EFI_GUID *EncapsulationGuid;
|
||||||
|
//
|
||||||
|
// If the section REQUIRES an extraction protocol, register for RPN
|
||||||
|
// when the required GUIDed extraction protocol becomes available.
|
||||||
|
//
|
||||||
|
EFI_EVENT Event;
|
||||||
} CORE_SECTION_CHILD_NODE;
|
} CORE_SECTION_CHILD_NODE;
|
||||||
|
|
||||||
#define CORE_SECTION_STREAM_SIGNATURE SIGNATURE_32('S','X','S','S')
|
#define CORE_SECTION_STREAM_SIGNATURE SIGNATURE_32('S','X','S','S')
|
||||||
|
@ -91,7 +96,6 @@ typedef struct {
|
||||||
CORE_SECTION_CHILD_NODE *ChildNode;
|
CORE_SECTION_CHILD_NODE *ChildNode;
|
||||||
CORE_SECTION_STREAM_NODE *ParentStream;
|
CORE_SECTION_STREAM_NODE *ParentStream;
|
||||||
VOID *Registration;
|
VOID *Registration;
|
||||||
EFI_EVENT Event;
|
|
||||||
} RPN_EVENT_CONTEXT;
|
} RPN_EVENT_CONTEXT;
|
||||||
|
|
||||||
|
|
||||||
|
@ -558,6 +562,7 @@ NotifyGuidedExtraction (
|
||||||
// Close the event when done.
|
// Close the event when done.
|
||||||
//
|
//
|
||||||
gBS->CloseEvent (Event);
|
gBS->CloseEvent (Event);
|
||||||
|
Context->ChildNode->Event = NULL;
|
||||||
FreePool (Context);
|
FreePool (Context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -585,13 +590,13 @@ CreateGuidedExtractionRpnEvent (
|
||||||
Context->ChildNode = ChildNode;
|
Context->ChildNode = ChildNode;
|
||||||
Context->ParentStream = ParentStream;
|
Context->ParentStream = ParentStream;
|
||||||
|
|
||||||
Context->Event = EfiCreateProtocolNotifyEvent (
|
Context->ChildNode->Event = EfiCreateProtocolNotifyEvent (
|
||||||
Context->ChildNode->EncapsulationGuid,
|
Context->ChildNode->EncapsulationGuid,
|
||||||
TPL_NOTIFY,
|
TPL_NOTIFY,
|
||||||
NotifyGuidedExtraction,
|
NotifyGuidedExtraction,
|
||||||
Context,
|
Context,
|
||||||
&Context->Registration
|
&Context->Registration
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -646,7 +651,7 @@ CreateChildNode (
|
||||||
//
|
//
|
||||||
// Allocate a new node
|
// Allocate a new node
|
||||||
//
|
//
|
||||||
*ChildNode = AllocatePool (sizeof (CORE_SECTION_CHILD_NODE));
|
*ChildNode = AllocateZeroPool (sizeof (CORE_SECTION_CHILD_NODE));
|
||||||
Node = *ChildNode;
|
Node = *ChildNode;
|
||||||
if (Node == NULL) {
|
if (Node == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
@ -1289,6 +1294,11 @@ FreeChildNode (
|
||||||
//
|
//
|
||||||
CloseSectionStream (ChildNode->EncapsulatedStreamHandle);
|
CloseSectionStream (ChildNode->EncapsulatedStreamHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ChildNode->Event != NULL) {
|
||||||
|
gBS->CloseEvent (ChildNode->Event);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Last, free the child node itself
|
// Last, free the child node itself
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in New Issue