kerneltest/f32test/bench/t_fat_perf.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

/**
* Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
* File Name:		f32test/bench/t_fat_perf.h
* Include file for t_fat_perf.cpp (PREQ 1885).
* 
*
*/



//Include Files
#include <f32file.h>
#include <e32test.h>
#include <hal.h>
#include "t_server.h"
#include "fat_utils.h"
#include "f32_test_utils.h" 

using namespace F32_Test_Utils;
using namespace Fat_Test_Utils;

extern TInt gTestCaseNo;

extern TFileName 	gPath;
extern TFileName 	gFileNameBase;
extern TInt 		gFileNo;
extern TInt		    gTestCase;
extern TInt			gCacheClear;
extern TInt         gZeroPadFileNumberForFixedLengthFileNames;

//////////////////////////////////////////////////////////////////////////////
// Interfaces

// File Operation Modes
enum TFileOperationMode
	{
	EFATPerfFileOpen,
	EFATPerfFileCreate,
	EFATPerfFileReplace,
	EFATPerfFileDelete,
	EFATPerfFileWrite,
	EFATPerfFileRead,
	};

// File Creation Options
enum TNamingConOrRan
	{
	EConsecutive,
	ERandom,
	};

// Standards
enum TNamingUniOrAsc
	{
	EAscii,
	EUnicode,
	};

// Test function names
enum TTestFunction
	{
	EFATPerfSetup,
	EFATPerfCreate,
	EFATPerfOpen,
	EFATPerfDelete,
	EFATPerfRead,
	EFATPerfWrite,
	EFATPerfDirCacheInfo,
	};
	
// For DirCache info printing 
// These enum values are based on enum TControlIO defined in \f32\sfat\common_constants.h
enum TDirCacheControlIOMap
	{
	ETestDumpFATDirCache = 15,	///<15
	ETestFATDirCacheInfo = 16,	///<16
	};

// File Naming schemes
class TNamingSchemeParam
	{
public:
    TNamingSchemeParam();
    
public:
	TNamingConOrRan	iConOrRan;
	TNamingUniOrAsc	iUniOrAsc;
	TBool iZeroPadFileNumber; // Only applies to consecutive file name generation
	TFileName 	iFileNameBase;
	TUint	iMaxFileNameLength;	// Applies only to random name generation
	TUint	iMinStringLength;
	};

class CMeasureAndLogUnit;

// File Operation Parameters
struct TFileOpUnitParam
	{
	TFileName 	iDirName;
	TNamingSchemeParam iNamingSchemeParam;
	TFileOperationMode	iFileOpMode;
	CMeasureAndLogUnit* iMLUnitPtr;
	};

// Directory Unit Parameters
struct TDirUnitParam
	{
	TUint		iPriority;
	TFileName	iDirName;
	TUint		iRuns;
	TUint		iFilesPerRun;
	TUint		iSampleInterval;
	TNamingSchemeParam		iNamingScheme;
	TFileOperationMode		iFileOpMode;
	};

struct	TMLUnitParam
	{
	TInt	iID;
	};

struct TMLParam
	{
	TFileName	iDirName;
	TFileName	iFileName;
	TNamingSchemeParam iNamingScheme;
	TUint	iCurFileNo;
	TFileOperationMode	iFileOpMode;
	};

/////////////////////////////////////////////////////////////////////////////////////////////
// Module definition


// Measurement and Log Unit
class CMeasureAndLogUnit : CBase
	{
public:
	static CMeasureAndLogUnit* NewLC(const TMLUnitParam& aParam);
	static CMeasureAndLogUnit* NewL(const TMLUnitParam& aParam);
	~CMeasureAndLogUnit();
	TInt	MeasureStart();
	TInt	MeasureEnd();
	TInt	Log(const TFileName& aDirName, const TFileName& aFileName, TUint aCurrentFileNo, TUint aCurrentFilePos);
private:
	CMeasureAndLogUnit();
	void ConstructL(const TMLUnitParam& aParam);
	TInt	DoMeasureStart();
	TInt	DoMeasureEnd();
	TInt	DoLog(const TFileName& aFileName, TUint aCurrentFileNo, TUint aCurrentFilePos);
	
private:
	TInt	iID;
	TUint32	iStartStatus;
	TUint32	iEndStatus;
	TInt	iFreq;
	TReal	iScale;		
	TUint	iLogItemNo;
	};

// File Operation Unit
class CFileOperationUnit : CBase
	{
public:
	static CFileOperationUnit* NewLC(const TFileOpUnitParam& aParam);
	static CFileOperationUnit* NewL(const TFileOpUnitParam& aParam);
	~CFileOperationUnit();
	
	TInt 	Run(const TFileName& aDirName, const TFileName& aFileName, TBool aIsTakingMeasurement, TUint aCurFileNo, TUint aCurFilePos);
	void	SetMLUnit(CMeasureAndLogUnit* aMLUnit);

private:
	CFileOperationUnit();	
	void ConstructL(const TFileOpUnitParam& aParam);

private:
	TFileName 	iDirName;
	TNamingSchemeParam iNamingSchemeParam;
	TFileOperationMode	iFileOpMode;
	CMeasureAndLogUnit* iMLUnitPtr;
	RFs					iRFs;
	TBool				iDirCreated;
	};


class CDirUnit : public CBase
	{
public:
	static CDirUnit* NewLC(const TDirUnitParam& aParam, const TChar aDriveChar);
	static CDirUnit* NewL(const TDirUnitParam& aParam, const TChar aDriveChar);
	~CDirUnit();
	TInt Run(const TInt aCurPriority);
	void SetMLUnit(CMeasureAndLogUnit* aMLUnit);
	TInt Priority();
	const TFileName& Name();

private:
	CDirUnit();
	void ConstructL(const TDirUnitParam& aParam, const TChar aDriveChar);

	TInt 	GenerateFileName(TFileName& aFileName); // uses iNameGen
	TBool 	CheckMeasurementTaking();		     	// uses currentFileNo, 
												    // totalFileNo, 
												    // samplingInterval
	TInt 	DoFileOperation();
	TFileName GenerateRandomString(const TUint aMinStringLength, const TUint aMaxStringLength, const TNamingUniOrAsc aUniOrAsc);
	TBool FileNameIsUnique(const TFileName& aFileName);
private:
	TInt					iPriority;
	TFileName				iDirName;
	TUint					iRuns;
	TUint					iCurrentRunNo;
	TUint					iFilesPerRun;
	TUint					iCurrentFileNo;
	TUint					iTotalFileNo;
	TUint					iSampleInterval;
	
	TUint                   iNumDigitsInTotalFileNo;    // The number of digits iTotalFileNo has.
                                                        // Used to zero pad the file number if iZeroPadFileNumberForFixedWidthFileNames is ETrue
	
	TNamingConOrRan	iConOrRan;                 // Consecutive or random
	TNamingUniOrAsc	iUniOrAsc;                 // ASCII or Unicode
	TBool iZeroPadFileNumberForFixedLengthFileNames;
	TFileName 			iFileNameBase;
	TUint				iMaxFileNameLength;   // Applies only to random name generation
	TUint				iMinStringLength;     // Applies only to random name generation
	
	CFileOperationUnit* 	iFileOpUnit;
	CMeasureAndLogUnit*	iMLUnitPtr;
	
	};

//Execution Unit
class CExecutionUnit : public CBase
	{
public:
	static CExecutionUnit* NewLC(CMeasureAndLogUnit* aMLUnit, const TChar aDriveChar);
	static CExecutionUnit* NewL(CMeasureAndLogUnit* aMLUnit, const TChar aDriveChar);

	~CExecutionUnit();

	TInt 	AddDirUnitL(const TDirUnitParam& aParam);
	TInt	RecalculateCurrentPrioirty();
	TInt 	Run();

	///For Debug
	TUint ForDebug_AddrOfDirUnit(TUint aDirUnitIter);
	TUint ForDebug_AddrOfDirUnitArray();

private:
	CExecutionUnit();
	void ConstructL(CMeasureAndLogUnit* aMLUnit, const TChar aDriveChar);

private:
	// Array of CDirUnit
	RPointerArray<CDirUnit>	iDirUnitArray;
	
	// Logging Unit
	CMeasureAndLogUnit*	iMLUnitPtr;	// no ownership
	
	// Current priority
	TInt 	iCurPriority;
	
	TChar	iDriveChar;
	
	}; 
	
/*-- EOF--*/