Moved the super-file handle into FTK and fixed various memory leaks in the FLAIM/XFLAIM unit tests.

git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@575 0109f412-320b-0410-ab79-c3e0c5ffbbe6
This commit is contained in:
ahodgkinson
2006-06-15 17:05:55 +00:00
parent 9f7ca8edd3
commit 2fabd31c06
30 changed files with 1343 additions and 1866 deletions

View File

@@ -2142,6 +2142,7 @@ FLMEXP RCODE FLMAPI FlmDbRebuild(
FDB * pDb = NULL;
FFILE * pFile;
F_SuperFileHdl * pSFileHdl = NULL;
F_SuperFileClient * pSFileClient = NULL;
FLMBOOL bFileLocked = FALSE;
FLMBOOL bWriteLocked = FALSE;
REBUILD_STATE * pRebuildState = NULL;
@@ -2448,25 +2449,37 @@ FLMEXP RCODE FLMAPI FlmDbRebuild(
// If no block size has been specified or determined yet, use what we
// read from the file header.
if (!pCreateOpts->uiBlockSize)
if( !pCreateOpts->uiBlockSize)
{
pCreateOpts->uiBlockSize = pHdrInfo->FileHdr.uiBlockSize;
}
// Open the corrupted database
if ((pSFileHdl = f_new F_SuperFileHdl) == NULL)
if( (pSFileHdl = f_new F_SuperFileHdl) == NULL)
{
rc = RC_SET( FERR_MEM);
goto Exit;
}
if( RC_BAD( rc = pSFileHdl->setup( pszSourceDbPath, pszSourceDataDir,
pHdrInfo->FileHdr.uiVersionNum)))
if( (pSFileClient = f_new F_SuperFileClient) == NULL)
{
rc = RC_SET( FERR_MEM);
goto Exit;
}
if( RC_BAD( rc = pSFileClient->setup(
pszSourceDbPath, pszSourceDataDir, pHdrInfo->FileHdr.uiVersionNum)))
{
goto Exit;
}
if( RC_BAD( rc = pSFileHdl->setup( pSFileClient)))
{
goto Exit;
}
pSFileHdl->setBlockSize( pCreateOpts->uiBlockSize);
pRebuildState->pSFileHdl = pSFileHdl;
// Calculate the file size.
@@ -2532,7 +2545,9 @@ Exit:
f_mutexLock( gv_FlmSysData.hShareMutex);
bMutexLocked = TRUE;
}
pTmpFile1 = gv_FlmSysData.pLrnuFile;
while (pTmpFile1)
{
if (pTmpFile1 == pTmpFile)
@@ -2551,24 +2566,26 @@ Exit:
f_mutexLock( gv_FlmSysData.hShareMutex);
bMutexLocked = TRUE;
}
if (!(--pFile->uiUseCount))
{
flmLinkFileToNUList( pFile);
}
}
if (bMutexLocked)
if( bMutexLocked)
{
f_mutexUnlock( gv_FlmSysData.hShareMutex);
bMutexLocked = FALSE;
}
if (bWriteLocked)
if( bWriteLocked)
{
pWriteLockObj->unlock();
bWriteLocked = FALSE;
}
if (bFileLocked)
if( bFileLocked)
{
pFileLockObj->unlock();
bFileLocked = FALSE;
@@ -2584,19 +2601,19 @@ Exit:
pCFileHdl->Release();
}
if (pWriteLockObj)
if( pWriteLockObj)
{
pWriteLockObj->Release();
pWriteLockObj = NULL;
}
if (pFileLockObj)
if( pFileLockObj)
{
pFileLockObj->Release();
pFileLockObj = NULL;
}
if (pLockFileHdl)
if( pLockFileHdl)
{
pLockFileHdl->Release();
pLockFileHdl = NULL;
@@ -2607,7 +2624,7 @@ Exit:
f_free( &pDefaultCreateOpts);
}
if (pRebuildState)
if( pRebuildState)
{
if( puiTotRecsRV)
{
@@ -2619,14 +2636,13 @@ Exit:
*puiRecsRecovRV = pRebuildState->CallbackData.uiRecsRecov;
}
if ((pRebuildState->pStateInfo) &&
(pRebuildState->pStateInfo->pRecord))
if( pRebuildState->pStateInfo && pRebuildState->pStateInfo->pRecord)
{
pRebuildState->pStateInfo->pRecord->Release();
}
if (pRebuildState->pRecord)
if( pRebuildState->pRecord)
{
pRebuildState->pRecord->Release();
pRebuildState->pRecord = NULL;
@@ -2671,6 +2687,11 @@ Exit:
{
f_semDestroy( &hWaitSem);
}
if( pSFileClient)
{
pSFileClient->Release();
}
return( rc);
}
@@ -2681,26 +2702,27 @@ Desc: This routine reads through a database and makes a best guess as to
the true block size of the database.
*****************************************************************************/
FSTATIC RCODE bldDetermineBlkSize(
const char * pszSourceDbPath,
const char * pszSourceDataDir,
FLMUINT uiDbVersion,
FLMUINT uiMaxFileSize,
FLMUINT * puiBlkSizeRV,
STATUS_HOOK fnStatusFunc,
REBUILD_INFO * pCallbackData,
void * AppArg)
const char * pszSourceDbPath,
const char * pszSourceDataDir,
FLMUINT uiDbVersion,
FLMUINT uiMaxFileSize,
FLMUINT * puiBlkSizeRV,
STATUS_HOOK fnStatusFunc,
REBUILD_INFO * pCallbackData,
void * AppArg)
{
RCODE rc = FERR_OK;
FLMBYTE ucBlkHeader [BH_OVHD];
FLMUINT uiBytesRead;
FLMUINT uiBlkAddress;
FLMUINT uiFileNumber = 0;
FLMUINT uiOffset = 0;
FLMUINT uiCount4K = 0;
FLMUINT uiCount8K = 0;
FLMUINT64 ui64BytesDone = 0;
IF_FileHdl * pFileHdl = NULL;
F_SuperFileHdl * pSFileHdl = NULL;
RCODE rc = FERR_OK;
FLMBYTE ucBlkHeader [BH_OVHD];
FLMUINT uiBytesRead;
FLMUINT uiBlkAddress;
FLMUINT uiFileNumber = 0;
FLMUINT uiOffset = 0;
FLMUINT uiCount4K = 0;
FLMUINT uiCount8K = 0;
FLMUINT64 ui64BytesDone = 0;
IF_FileHdl * pFileHdl = NULL;
F_SuperFileHdl * pSFileHdl = NULL;
F_SuperFileClient * pSFileClient = NULL;
// Open the corrupted database
@@ -2709,9 +2731,20 @@ FSTATIC RCODE bldDetermineBlkSize(
rc = RC_SET( FERR_MEM);
goto Exit;
}
if( (pSFileClient = f_new F_SuperFileClient) == NULL)
{
rc = RC_SET( FERR_MEM);
goto Exit;
}
if( RC_BAD( rc = pSFileClient->setup(
pszSourceDbPath, pszSourceDataDir, uiDbVersion)))
{
goto Exit;
}
if( RC_BAD( rc = pSFileHdl->setup( pszSourceDbPath, pszSourceDataDir,
uiDbVersion)))
if( RC_BAD( rc = pSFileHdl->setup( pSFileClient)))
{
goto Exit;
}
@@ -2720,6 +2753,7 @@ FSTATIC RCODE bldDetermineBlkSize(
pCallbackData->iDoingFlag = REBUILD_GET_BLK_SIZ;
pCallbackData->bStartFlag = TRUE;
for (;;)
{
if (uiOffset >= uiMaxFileSize || !uiFileNumber)
@@ -2830,6 +2864,11 @@ Exit:
{
pSFileHdl->Release();
}
if( pSFileClient)
{
pSFileClient->Release();
}
return( rc);
}