From d2720e0ce8fc47df268f7b494469114391115ec9 Mon Sep 17 00:00:00 2001 From: mdkinney Date: Fri, 5 Nov 2010 20:22:18 +0000 Subject: [PATCH] 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 --- .../Universal/DataHubDxe/DataHub.c | 127 ++++++++++-------- 1 file changed, 69 insertions(+), 58 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; - } - // - // Use the Class filter the event was created with. - // - ClassFilter = FilterDriver->ClassFilter; - - if (*MonotonicCount == 0) { - // - // Use the MTC from the Filter Driver. - // - FilterMonotonicCount = FilterDriver->GetNextMonotonicCount; - - // - // 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. - // - *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; - } + // + // 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; } + 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; } // - // Return the record + // Use the Class filter the event was created with. + // + ClassFilter = FilterDriver->ClassFilter; + + // + // 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) { + // + // If this was not the last record then update the count associated with the filter + // + FilterDriver->GetNextMonotonicCount = *MonotonicCount; + } else { + // + // Save the MonotonicCount of the last record which has been read + // + FilterDriver->GetNextMonotonicCount = (*Record)->LogMonotonicCount; + } + return EFI_SUCCESS; + } + + // + // 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 (*MonotonicCount != 0) { + // + // Update the count associated with the filter + // + FilterDriver->GetNextMonotonicCount = *MonotonicCount; - if (FilterDriver != NULL) { // - // If we have a filter driver update the records that have been read. - // If MonotonicCount is zero No more reacords left. - // - if (*MonotonicCount == 0) { - // - // Save the current Record MonotonicCount. - // - FilterDriver->GetNextMonotonicCount = (*Record)->LogMonotonicCount; - } else { - // - // Point to next undread record - // - 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; }