📄 davrcvr.c
字号:
{
compare_info.CompareValue = FDI_HT_ReclaimTable;
status = GetNextHeader(&FDI_GlobalInfo, HDR_ByTypeOnly,
&compare_info, TRUE);
if ((status != ERR_NONE) && (status != ERR_NO_MORE_ENTRIES) &&
(status != ERR_PARAM))
{
return(status);
}
if ((status == ERR_NONE) &&
(HDR_GetHdrState(FDI_GlobalInfo.HeaderPtr->Attr16)
== HDR_HA_STATE_Valid))
{
RT_valid_found = TRUE;
}
} while (!((status == ERR_NO_MORE_ENTRIES) || (RT_valid_found == TRUE)));
/* if a valid Reclaim Table header is not found */
if (RT_valid_found == FALSE)
{
status = ERR_NONE;
HDR_InitSearchInfo((&FDI_GlobalInfo), (&FDI_GlobalHeader));
while (status != ERR_NO_MORE_ENTRIES)
{
status = GetNextHeader(&FDI_GlobalInfo, HDR_ByNextObject, 0, TRUE);
if ((status != ERR_NONE) && (status != ERR_NO_MORE_ENTRIES) &&
(status != ERR_PARAM))
{
return(status);
}
/* Check if there is a reclaim table header or an OTT table header. */
if ((status == ERR_NONE) &&
((FDI_GlobalInfo.HeaderPtr->ObjectType == FDI_HT_ReclaimTable) ||
(FDI_GlobalInfo.HeaderPtr->ObjectType == FDI_HT_ObjTrkTable)))
{
/* If there is a WIP (or absorbed valid) reclaim table header
or a WIP (or absorbed valid) OTT table, invalidate it because
the table data are unknown. */
if ((HDR_GetStatusAttr(FDI_GlobalInfo.HeaderPtr->Attr16)
== HDR_HA_WriteInProgress) ||
(HDR_GetHdrState(FDI_GlobalInfo.HeaderPtr->Attr16)
== HDR_HA_Valid))
{
/* Mark OTT table header in flash to Invalid */
status =
HDR_InvalidateHeader(FDI_GlobalInfo.CurrObj.HeaderAddress,
FDI_GlobalInfo.HeaderPtr);
if (status != ERR_NONE)
{
return status;
}
}
/* if there is a valid OTT break out of the loop */
else if ((HDR_GetHdrState(FDI_GlobalInfo.HeaderPtr->Attr16)
== HDR_HA_STATE_Valid) &&
(FDI_GlobalInfo.HeaderPtr->ObjectType
== FDI_HT_ObjTrkTable))
{
break;
}
}
}
}
/* If reclaim table is not found */
else if(status)
{
/*## Check if there is a valid OTT table */
HDR_InitSearchInfo((&FDI_GlobalInfo), (&FDI_GlobalHeader));
compare_info.CompareValue = FDI_HT_ObjTrkTable;
status = GetNextHeader(&FDI_GlobalInfo, HDR_ByTypeOnly,
&compare_info, TRUE);
if ((status != ERR_NONE) && (status != ERR_NO_MORE_ENTRIES) &&
(status != ERR_PARAM))
{
return(status);
}
}
RECOVER_MarkDatabaseBusy();
/* status is tested to see if there was even a page reclaim table
* in the first place. Thus when it wasn't found it was returning
* NoMoreEntries.
*/
if (status == ERR_NONE)
{
/* If object is a valid reclaim table object, restart page reclaim */
if ((HDR_GetHdrState(FDI_GlobalInfo.HeaderPtr->Attr16)
== HDR_HA_STATE_Valid) &&
(FDI_GlobalInfo.HeaderPtr->ObjectType == FDI_HT_ReclaimTable))
{
/* Restart Page Reclaim */
status = RECOVER_RestartPageReclaim();
if (status)
{
return(status);
}
}
/* If object is a valid OTT object, restart page reclaim */
else if ((HDR_GetHdrState(FDI_GlobalInfo.HeaderPtr->Attr16)
== HDR_HA_STATE_Valid) &&
(FDI_GlobalInfo.HeaderPtr->ObjectType == FDI_HT_ObjTrkTable))
{
/* Restart Page Reclaim */
status = RECOVER_RestartPageReclaim();
if (status != ERR_NONE)
{
return(status);
}
}
}
/*## Check that reclaim block is erased (Extra Error Checking) */
if (!FLASH_IsAreaErased(BlockAlign(FDI_ReclaimBlockAddress),
BlockAlign(FDI_ReclaimBlockAddress) + FDI_BlockSize))
{
return (ERR_SYSTEM);
}
/*## Perform a paragraph reclaim if system reserves in are used */
if (FDI_MemUsage.ParaSpace.Free <
FDI_MemUsage.ParaOverhead.ReclaimReserves)
{
status = RECLAIM_Cleanup(ReclaimParagraphObjects, FALSE);
}
/*## Restore WIP objects */
if (!status)
{
status = RECOVER_RestoreWriteInProgressObjects(TRUE);
#ifdef ENABLE_RECOVER_TESTS
EVT_TestEvent(EVT_RECOVER_ValidateSystem_End);
#endif
if(status)
{
return (status);
}
status = RECOVER_IsInvalidPageObjectFound(TRUE);
if (!status)
{
status = RECLAIM_Cleanup(ReclaimPageObjects, FALSE);
}
else if (status == ERR_NO_MORE_ENTRIES)
{
status = ERR_NONE;
}
}
if (!status)
{
/* Recovery completed successfully, now we're ready
* to say the database is in tact.
*/
RECOVER_MarkDatabaseReady();
}
return (status);
}
/*########################################################################*/
/*### Functions for restarting a reclaim/reallocate process */
/*########################################################################*/
/*#################################################################
### RECOVER_RestartReclaim
###
### DESCRIPTION:
### This function will restart a paragraph reclaim.
###
### PARAMETERS
### cfg_entry_index - The index to the configuration entry
### that indicate a reclaim is in progress.
### cfg_entry - The actual configuration entry.
###
### RETURNS:
### When this function passes with no errors a value of 0 is
### returned otherwise, it returns a status of type ERR_CODE.
###*/
ERR_CODE RECOVER_RestartReclaim(UINT8 cfg_entry_index,
const CFGHDR_ConfigurationEntry *cfg_entry)
{
ERR_CODE status;
#ifdef ENABLE_RECOVER_TESTS
EVT_TestEvent(EVT_RECOVER_RestartParagraphReclaim_Start);
#endif
/* Set Global flag for System State */
SetSystemState(FDI_SystemState, FDI_ST_ReclaimRecover);
ReclaimState.ConfigIndex = cfg_entry_index;
ReclaimState.ConfigEntry = *cfg_entry;
status = RECLAIM_Cleanup(ReclaimParagraphObjects, TRUE);
#ifdef ENABLE_RECOVER_TESTS
EVT_TestEvent(EVT_RECOVER_RestartParagraphReclaim_End);
#endif
return(status);
}
/*#################################################################
### RECOVER_RestartPageReclaim
###
### DESCRIPTION:
### This function will restart a page reclaim.
###
### PARAMETERS
### none.
###
### RETURNS:
### When this function passes with no errors a value of 0 is
### returned otherwise, it returns a status of type ERR_CODE.
###*/
ERR_CODE RECOVER_RestartPageReclaim(void)
{
ERR_CODE status;
#ifdef ENABLE_RECOVER_TESTS
EVT_TestEvent(EVT_RECOVER_RestartPageReclaim_Start);
#endif
/* Set Global flag for System State */
SetSystemState(FDI_SystemState, FDI_ST_ReclaimRecover);
status = RECLAIM_Cleanup(ReclaimPageObjects, TRUE);
#ifdef ENABLE_RECOVER_TESTS
EVT_TestEvent(EVT_RECOVER_RestartPageReclaim_End);
#endif
return(status);
}
/*#################################################################
### RECOVER_RestartReAllocate
###
### DESCRIPTION:
### This function will restart a reallocate (reclaim in place)
###
### PARAMETERS
### cfg_entry_index - The index to the configuration entry
### that indicate a reclaim is in progress.
### cfg_entry - The actual configuration entry.
###
### RETURNS:
### When this function passes with no errors a value of 0 is
### returned otherwise, it returns a status of type ERR_CODE.
###*/
ERR_CODE RECOVER_RestartReAllocate(UINT8 cfg_entry_index,
const CFGHDR_ConfigurationEntry *cfg_entry)
{
ERR_CODE status;
HDR_SearchInfo obj_info;
#ifdef ENABLE_RECOVER_TESTS
EVT_TestEvent(EVT_RECOVER_RestartReAllocate_Start);
#endif
/* Set Global flag for System State */
SetSystemState(FDI_SystemState, FDI_ST_ReallocateRecover);
obj_info.CurrObj.ConfigEntry = *cfg_entry;
obj_info.CurrObj.ObjectAddress = (UINT32)cfg_entry_index;
status = RECINPLC_ReclaimObjectInPlace(&obj_info, TRUE);
#ifdef ENABLE_RECOVER_TESTS
EVT_TestEvent(EVT_RECOVER_RestartReAllocate_End);
#endif
return(status);
}
/*########################################################################*/
/*### Functions that check configuration header for system status */
/*########################################################################*/
/*#################################################################
### RECOVER_CheckSystemStatus
###
### DESCRIPTION:
### This function will check the configuration header in
### the header table and reclaim blocks for system status.
### base on that status it will restart the correct reclaim.
###
### PARAMETERS
### none.
###
### RETURNS:
### When this function passes with no errors a value of 0 is
### returned otherwise, it returns a status of type ERR_CODE.
###*/
ERR_CODE RECOVER_CheckSystemStatus(BOOLEAN restart)
{
UINT8 ht_entry_index;
UINT8 rb_entry_index;
ERR_CODE status;
RECOVER_CfgEntryStatus ht_cfg_status;
RECOVER_CfgEntryStatus rb_cfg_status;
CFGHDR_ConfigurationEntry ht_cfg_entry;
CFGHDR_ConfigurationEntry rb_cfg_entry;
status = ERR_NONE;
#ifdef ENABLE_RECOVER_TESTS
EVT_TestEvent(EVT_RECOVER_CheckSystemStatus_Start);
#endif
/* Check Configuration Header in Header Table Block */
status = RECOVER_CheckConfigurationHeader(
ParagraphAlign(FDI_LastObjectAddress),
&ht_cfg_entry,
&ht_entry_index, &ht_cfg_status,
restart);
if(status)
{
return status;
}
/* Check Configuration Header in Reclaim Block */
status = RECOVER_CheckConfigurationHeader(ParagraphAlign(
FDI_ReclaimBlockAddress + FDI_BlockSize - 1),
&rb_cfg_entry,
&rb_entry_index, &rb_cfg_status, restart);
if(status)
{
return status;
}
if (ht_cfg_status == ConfigEntries)
{
/* Check what scan revealed */
if ((!CFGHDR_IsUnusedConfigurationEntry(ht_cfg_entry)) &&
(ht_entry_index != (UINT8)0xFF))
{
/* Entry in use was found, now check for a reclaim */
if (CFGHDR_GetReclaimEntryState(ht_cfg_entry) ==
CFGHDR_STATE_ReclaimInProgress)
{
/* Restart Paragraph Reclaim */
status = RECOVER_RestartReclaim(ht_entry_index, &ht_cfg_entry);
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -