⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 davrcvr.c

📁 Flash file system
💻 C
📖 第 1 页 / 共 3 页
字号:
   {    
      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 + -