summaryrefslogtreecommitdiff
path: root/IntelFrameworkModulePkg
diff options
context:
space:
mode:
authormdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>2010-11-05 20:22:18 +0000
committermdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>2010-11-05 20:22:18 +0000
commitd2720e0ce8fc47df268f7b494469114391115ec9 (patch)
treed0a206a97094f4e659b9b9f438be8a81b021a8dd /IntelFrameworkModulePkg
parent3e516e5e0f0b3c75f5b8cf3af732f006ab32a3e6 (diff)
downloadedk2-platforms-d2720e0ce8fc47df268f7b494469114391115ec9.tar.xz
Fix bug in DataHub where it would skip the first record in a set when a filter is being used. Also add comments and update source code logic to make it easier to understand and maintain.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11008 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'IntelFrameworkModulePkg')
-rw-r--r--IntelFrameworkModulePkg/Universal/DataHubDxe/DataHub.c115
1 files changed, 63 insertions, 52 deletions
diff --git a/IntelFrameworkModulePkg/Universal/DataHubDxe/DataHub.c b/IntelFrameworkModulePkg/Universal/DataHubDxe/DataHub.c
index dad529bd38..e4dfa29d69 100644
--- a/IntelFrameworkModulePkg/Universal/DataHubDxe/DataHub.c
+++ b/IntelFrameworkModulePkg/Universal/DataHubDxe/DataHub.c
@@ -286,85 +286,96 @@ DataHubGetNextRecord (
DATA_HUB_INSTANCE *Private;
DATA_HUB_FILTER_DRIVER *FilterDriver;
UINT64 ClassFilter;
- UINT64 FilterMonotonicCount;
Private = DATA_HUB_INSTANCE_FROM_THIS (This);
FilterDriver = NULL;
- FilterMonotonicCount = 0;
ClassFilter = EFI_DATA_RECORD_CLASS_DEBUG |
EFI_DATA_RECORD_CLASS_ERROR |
EFI_DATA_RECORD_CLASS_DATA |
EFI_DATA_RECORD_CLASS_PROGRESS_CODE;
- if (FilterDriverEvent != NULL) {
- //
- // For events the beginning is the last unread record. This info is
- // stored in the instance structure, so we must look up the event
- // to get the data.
- //
- FilterDriver = FindFilterDriverByEvent (
- &Private->FilterDriverListHead,
- *FilterDriverEvent
- );
- if (FilterDriver == NULL) {
- return EFI_INVALID_PARAMETER;
+ //
+ // If FilterDriverEvent is NULL, then return the next record
+ //
+ if (FilterDriverEvent == NULL) {
+ *Record = GetNextDataRecord (&Private->DataListHead, ClassFilter, MonotonicCount);
+ if (*Record == NULL) {
+ return EFI_NOT_FOUND;
}
- //
- // Use the Class filter the event was created with.
- //
- ClassFilter = FilterDriver->ClassFilter;
+ return EFI_SUCCESS;
+ }
+
+ //
+ // For events the beginning is the last unread record. This info is
+ // stored in the instance structure, so we must look up the event
+ // to get the data.
+ //
+ FilterDriver = FindFilterDriverByEvent (
+ &Private->FilterDriverListHead,
+ *FilterDriverEvent
+ );
+ if (FilterDriver == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+ //
+ // Use the Class filter the event was created with.
+ //
+ ClassFilter = FilterDriver->ClassFilter;
- if (*MonotonicCount == 0) {
+ //
+ // Retrieve the next record or the first record.
+ //
+ if (*MonotonicCount != 0 || FilterDriver->GetNextMonotonicCount == 0) {
+ *Record = GetNextDataRecord (&Private->DataListHead, ClassFilter, MonotonicCount);
+ if (*Record == NULL) {
+ return EFI_NOT_FOUND;
+ }
+
+ if (*MonotonicCount != 0) {
//
- // Use the MTC from the Filter Driver.
+ // If this was not the last record then update the count associated with the filter
//
- FilterMonotonicCount = FilterDriver->GetNextMonotonicCount;
-
+ FilterDriver->GetNextMonotonicCount = *MonotonicCount;
+ } else {
//
- // The GetNextMonotonicCount field remembers the last value from the previous time.
- // But we already processed this vaule, so we need to find the next one.
+ // Save the MonotonicCount of the last record which has been read
//
- *Record = GetNextDataRecord (&Private->DataListHead, ClassFilter, &FilterMonotonicCount);
- if (FilterMonotonicCount != 0) {
- *MonotonicCount = FilterMonotonicCount;
- }
-
- if ((FilterDriver->GetNextMonotonicCount != 0) && (FilterMonotonicCount == 0)) {
- //
- // If there is no new record to get exit now.
- //
- *MonotonicCount = 0;
- return EFI_NOT_FOUND;
- }
+ FilterDriver->GetNextMonotonicCount = (*Record)->LogMonotonicCount;
}
+ return EFI_SUCCESS;
}
+
//
- // Return the record
+ // This is a request to read the first record that has not been read yet.
+ // Set MonotoicCount to the last record successfuly read
+ //
+ *MonotonicCount = FilterDriver->GetNextMonotonicCount;
+
+ //
+ // Retrieve the last record successfuly read again, but do not return it since
+ // it has already been returned before.
//
*Record = GetNextDataRecord (&Private->DataListHead, ClassFilter, MonotonicCount);
if (*Record == NULL) {
return EFI_NOT_FOUND;
}
-
- if (FilterDriver != NULL) {
+
+ if (*MonotonicCount != 0) {
//
- // If we have a filter driver update the records that have been read.
- // If MonotonicCount is zero No more reacords left.
+ // Update the count associated with the filter
//
- if (*MonotonicCount == 0) {
- //
- // Save the current Record MonotonicCount.
- //
- FilterDriver->GetNextMonotonicCount = (*Record)->LogMonotonicCount;
- } else {
- //
- // Point to next undread record
- //
- FilterDriver->GetNextMonotonicCount = *MonotonicCount;
+ FilterDriver->GetNextMonotonicCount = *MonotonicCount;
+
+ //
+ // Retrieve the record after the last record successfuly read
+ //
+ *Record = GetNextDataRecord (&Private->DataListHead, ClassFilter, MonotonicCount);
+ if (*Record == NULL) {
+ return EFI_NOT_FOUND;
}
}
-
+
return EFI_SUCCESS;
}