diff -r 000000000000 -r a41df078684a userlibandfileserver/fileserver/sfile/sf_debug.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/sfile/sf_debug.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,600 @@ +// 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: +// f32\sfile\sf_debug.cpp +// +// + +#include "sf_std.h" +#include +#include "f32image.h" +#include +#include "sf_file_cache.h" + + +#if defined(_DEBUG) || defined(_DEBUG_RELEASE) + +// +// ONLY INCLUDED IN DEBUG BUILDS +// + +void PrintHeapSize(const TDesC& aMessage) +// +// Display the total memory available +// + { + + TInt biggest; + TInt heapSize = User::Allocator().Available(biggest); + RDebug::Print(_L("%S size=0x%x largest cell=0x%x"),&aMessage,heapSize,biggest); + } + +static void SetAllocFailure(const RMessage2* aMessage) +// +// Set alloc failure after allocCount allocations +// + { + + UserHeapAllocFailCount=aMessage->Int1(); + KernHeapAllocFailCount=UserHeapAllocFailCount; + if (UserHeapAllocFailCount>=0) + { + __UHEAP_FAILNEXT(UserHeapAllocFailCount); + __KHEAP_FAILNEXT(KernHeapAllocFailCount); + } + else + { + __UHEAP_RESET; + __KHEAP_RESET; + } + } + +TInt FsDebugFunction(CFsRequest* aRequest) +// +// SetAllocFailure - Set alloc failure after allocCount allocations +// SetErrorCondition - Set simulated error failure +// SetDebugRegister - Trigger tracing output +// DebugNotify - Request notification of a file server event - .FSY specific +// + { + + TInt r=KErrNone; + const RMessage2* message=&(aRequest->Message()); + switch (message->Int0()) + { + case EFsSetAllocFailure: + SetAllocFailure(message); + break; + case EFsSetErrorCondition: + ErrorCondition=message->Int1(); + ErrorCount=message->Int2(); + break; + case EFsSetDebugRegister: + DebugReg=message->Int1(); + break; + case EFsDebugNotify: + { + TUint notifyType=(aRequest->Message().Int2())&KDebugNotifyMask; + if (notifyType) + { + CDebugChangeInfo* info=new CDebugChangeInfo; + if(!info) + return(KErrNoMemory); + const RMessage2& m=aRequest->Message(); + info->Initialise(notifyType,(TRequestStatus*)m.Ptr3(),m,aRequest->Session()); + r=FsNotify::AddDebug(info); + if(r!=KErrNone) + delete(info); + else + aRequest->SetCompleted(EFalse); + } + else + r=KErrArgument; + break; + } + default: + break; + }; + return(r); + } + +TBool SimulateError(const RMessage2* aMessage) +// +// Return an error message if ErrorCount<=0 +// + { + TInt function = aMessage->Function() & KIpcFunctionMask; + + if (ErrorCondition!=KErrNone && + ( + function!=EFsDebugFunction || aMessage->Int0()!=EFsSetErrorCondition) && + function!=EFsNotifyChangeCancel && + function!=EFsNotifyChangeCancelEx && + function!=EFsNotifyDiskSpaceCancel && + function!=EFsFormatSubClose && + function!=EFsDirSubClose && + function!=EFsFileSubClose && + function!=EFsRawSubClose && + function!=EFsUnclamp && + + //-- this operation must not fail. It can only fail if the client's thread has died. + //-- in this case whole session will be cleaned up. + function!=EFsFileAdopt + ) + { + if (ErrorCount<=0) + return(ETrue); + ErrorCount--; + } + return(EFalse); + } + + +TPtrC GetFunctionName(TInt aFunction) +// +// Print number of alloc fails to complete a given function +// + { + + switch (aFunction) + { + case EFsDebugFunction: return _L("EFsDebugFunction"); + case EFsAddFileSystem: return _L("EFsAddFileSystem"); + case EFsRemoveFileSystem: return _L("EFsRemoveFileSystem"); + case EFsMountFileSystem: return _L("EFsMountFileSystem"); + case EFsNotifyChange: return _L("EFsNotifyChange"); + case EFsNotifyChangeCancel: return _L("EFsNotifyChangeCancel"); + case EFsDriveList: return _L("EFsDriveList"); + case EFsDrive: return _L("EFsDrive"); + case EFsVolume: return _L("EFsVolume"); + case EFsSetVolume: return _L("EFsSetVolume"); + case EFsSubst: return _L("EFsSubst"); + case EFsSetSubst: return _L("EFsSetSubst"); + case EFsRealName: return _L("EFsRealName"); + case EFsDefaultPath: return _L("EFsDefaultPath"); + case EFsSetDefaultPath: return _L("EFsSetDefaultPath"); + case EFsSessionPath: return _L("EFsSessionPath"); + case EFsSetSessionPath: return _L("EFsSetSessionPath"); + case EFsMkDir: return _L("EFsMkDir"); + case EFsRmDir: return _L("EFsRmDir"); + case EFsParse: return _L("EFsParse"); + case EFsDelete: return _L("EFsDelete"); + case EFsRename: return _L("EFsRename"); + case EFsReplace: return _L("EFsReplace"); + case EFsEntry: return _L("EFsEntry"); + case EFsSetEntry: return _L("EFsSetEntry"); + case EFsGetDriveName: return _L("EFsGetDriveName"); + case EFsSetDriveName: return _L("EFsSetDriveName"); + case EFsFormatSubClose: return _L("EFsFormatSubClose"); + case EFsDirSubClose: return _L("EFsDirSubClose"); + case EFsFileSubClose: return _L("EFsFileSubClose"); + case EFsRawSubClose: return _L("EFsRawSubClose"); + case EFsFileOpen: return _L("EFsFileOpen"); + case EFsFileCreate: return _L("EFsFileCreate"); + case EFsFileReplace: return _L("EFsFileReplace"); + case EFsFileTemp: return _L("EFsFileTemp"); + case EFsFileRead: return _L("EFsFileRead"); + case EFsFileWrite: return _L("EFsFileWrite"); + case EFsFileLock: return _L("EFsFileLock"); + case EFsFileUnLock: return _L("EFsFileUnLock"); + case EFsFileSeek: return _L("EFsFileSeek"); + case EFsFileFlush: return _L("EFsFileFlush"); + case EFsFileSize: return _L("EFsFileSize"); + case EFsFileSetSize: return _L("EFsFileSetSize"); + case EFsFileAtt: return _L("EFsFileAtt"); + case EFsFileSetAtt: return _L("EFsFileSetAtt"); + case EFsFileModified: return _L("EFsFileModified"); + case EFsFileSetModified: return _L("EFsFileSetModified"); + case EFsFileSet: return _L("EFsFileSet"); + case EFsFileChangeMode: return _L("EFsFileChangeMode"); + case EFsFileRename: return _L("EFsFileRename"); + case EFsDirOpen: return _L("EFsDirOpen"); + case EFsDirReadOne: return _L("EFsDirReadOne"); + case EFsDirReadPacked: return _L("EFsDirReadPacked"); + case EFsFormatOpen: return _L("EFsFormatOpen"); + case EFsFormatNext: return _L("EFsFormatNext"); + case EFsRawDiskOpen: return _L("EFsRawDiskOpen"); + case EFsRawDiskRead: return _L("EFsRawDiskRead"); + case EFsRawDiskWrite: return _L("EFsRawDiskWrite"); + case EFsResourceCountMarkStart: return _L("EFsResourceCountMarkStart"); + case EFsResourceCountMarkEnd: return _L("EFsResourceCountMarkEnd"); + case EFsResourceCount: return _L("EFsResourceCount"); + case EFsCheckDisk: return _L("EFsCheckDisk"); + case EFsGetShortName: return _L("EFsGetShortName"); + case EFsGetLongName: return _L("EFsGetLongName"); + case EFsIsFileOpen: return _L("EFsIsFileOpen"); + case EFsListOpenFiles: return _L("EFsListOpenFiles"); + case EFsSetNotifyUser: return _L("EFsSetNotifyUser"); + case EFsIsFileInRom: return _L("EFsIsFileInRom"); + case EFsGetNotifyUser: return _L("EFsGetNotifyUser"); + case EFsIsValidName: return _L("EFsIsValidName"); + case EFsReadFileSection: return _L("EFsReadFileSection"); + case EFsNotifyChangeEx: return _L("EFsNotifyChangeEx"); + case EFsNotifyChangeCancelEx: return _L("EFsNotifyChangeCancelEx"); + case EFsDismountFileSystem: return _L("EFsDismountFileSystem"); + case EFsFileSystemName: return _L("EFsFileSystemName"); + case EFsScanDrive: return _L("EFsScanDrive"); + case EFsControlIo: return _L("EFsControlIo"); + case EFsLockDrive: return _L("EFsLockDrive"); + case EFsUnlockDrive: return _L("EFsUnlockDrive"); + case EFsClearPassword: return _L("EFsClearPassword"); + case EFsNotifyDiskSpace: return _L("EFsNotifyDiskSpace"); + case EFsNotifyDiskSpaceCancel: return _L("EFsNotifyDiskSpaceCancel"); + case EFsMountFileSystemScan: return _L("EFsMountFileSystemScan"); + case EFsSessionToPrivate: return _L("EFsSessionToPrivate"); + case EFsPrivatePath: return _L("EFsPrivatePath"); + case EFsCreatePrivatePath: return _L("EFsCreatePrivatePath"); + case EFsFileDrive: return _L("EFsFileDrive"); + case EFsRemountDrive: return _L("EFsRemountDrive"); + case EFsAddExtension: return _L("EFsAddExtension"); + case EFsMountExtension: return _L("EFsMountExtension"); + case EFsDismountExtension: return _L("EFsDismountExtension"); + case EFsRemoveExtension: return _L("EFsRemoveExtension"); + case EFsExtensionName: return _L("EFsExtensionName"); + case EFsStartupInitComplete: return _L("EFsStartupInitComplete"); + case EFsSetLocalDriveMapping: return _L("EFsSetLocalDriveMapping"); + case EFsFileDuplicate: return _L("EFsFileDuplicate"); + case EFsFileAdopt: return _L("EFsFileAdopt"); + case EFsFinaliseDrive: return _L("EFsFinaliseDrive"); + case EFsSwapFileSystem: return _L("EFsSwapFileSystem"); + case EFsErasePassword: return _L("EFsErasePassword"); + case EFsReserveDriveSpace: return _L("EFsReserveDriveSpace"); + case EFsGetReserveAccess: return _L("EFsGetReserveAccess"); + case EFsReleaseReserveAccess: return _L("EFsReleaseReserveAccess"); + case EFsFileName: return _L("EFsFileName"); + case EFsGetMediaSerialNumber: return _L("EFsGetMediaSerialNumber"); + case EFsFileFullName: return _L("EFsFileFullName"); + case EFsAddPlugin: return _L("EFsAddPlugin"); + case EFsRemovePlugin: return _L("EFsRemovePlugin"); + case EFsMountPlugin: return _L("EFsMountPlugin"); + case EFsDismountPlugin: return _L("EFsDismountPlugin"); + case EFsPluginName: return _L("EFsPluginName"); + case EFsPluginOpen: return _L("EFsPluginOpen"); + case EFsPluginSubClose: return _L("EFsPluginSubClose"); + case EFsPluginDoRequest: return _L("EFsPluginDoRequest"); + case EFsPluginDoControl: return _L("EFsPluginDoControl"); + case EFsPluginDoCancel: return _L("EFsPluginDoCancel"); + case EFsNotifyDismount: return _L("EFsNotifyDismount"); + case EFsNotifyDismountCancel: return _L("EFsNotifyDismountCancel"); + case EFsAllowDismount: return _L("EFsAllowDismount"); + case EFsSetStartupConfiguration: return _L("EFsSetStartupConfiguration"); + case EFsFileReadCancel: return _L("EFsFileReadCancel"); + case EFsAddCompositeMount: return _L("EFsAddCompositeMount"); + case EFsSetSessionFlags: return _L("EFsSetSessionFlags"); + case EFsSetSystemDrive: return _L("EFsSetSystemDrive"); + case EFsBlockMap: return _L("EFsBlockMap"); + case EFsUnclamp: return _L("EFsUnclamp"); + case EFsFileClamp: return _L("EFsFileClamp"); + case EFsQueryVolumeInfoExt: return _L("EFsQueryVolumeInfoExt"); + case EFsInitialisePropertiesFile: return _L("EFsInitialisePropertiesFile"); + case EFsFileWriteDirty: return _L("EFsFileWriteDirty"); + case EFsSynchroniseDriveThread: return _L("EFsSynchroniseDriveThread"); + case EFsAddProxyDrive: return _L("EFsAddProxyDrive"); + case EFsRemoveProxyDrive: return _L("EFsRemoveProxyDrive"); + case EFsMountProxyDrive: return _L("EFsMountProxyDrive"); + case EFsDismountProxyDrive: return _L("EFsDismountProxyDrive"); + case EFsNotificationAdd : return _L("EFsNotificationAdd"); + case EFsNotificationBuffer : return _L("EFsNotificationBuffer"); + case EFsNotificationCancel : return _L("EFsNotificationCancel"); + case EFsNotificationOpen : return _L("EFsNotificationOpen"); + case EFsNotificationRemove : return _L("EFsNotificationRemove"); + case EFsNotificationRequest : return _L("EFsNotificationRequest"); + case EFsNotificationSubClose : return _L("EFsNotificationSubClose"); + case EFsLoadCodePage: return _L("EFsLoadCodePage"); + default: + return _L("Error unknown function"); + } + } + + +void PrintStartUpReason(TMachineStartupType aReason) +// +// Print the reason the machine is booting up +// + { + + TBuf<64> nameBuf; + switch (aReason) + { + case EStartupCold: nameBuf=_L("EStartupCold"); break; + case EStartupColdReset: nameBuf=_L("EStartupColdReset"); break; + case EStartupNewOs: nameBuf=_L("EStartupNewOs"); break; + case EStartupPowerFail: nameBuf=_L("StartupPowerFail"); break; + case EStartupWarmReset: nameBuf=_L("EStartupWarmReset"); break; + case EStartupKernelFault: nameBuf=_L("EStartupKernelFault"); break; + case EStartupSafeReset: nameBuf=_L("EStartupSafeReset"); break; + default: + nameBuf=_L("Error unknown startup type"); + } + __PRINT1(_L("Machine startup - %S"),&nameBuf); + }; + +LOCAL_C void AllocPrint(TInt aFunction) +// +// Print number of alloc fails to complete a given function +// + { + if (UserHeapAllocFailCount || KernHeapAllocFailCount) + { + TPtrC funcName=GetFunctionName(aFunction); + { + __PRINTALLOC(_L("Function %S UserAllocs %d KernAllocs %d"),&funcName,UserHeapAllocFailCount,KernHeapAllocFailCount); + } + } + } + +void SimulateAllocFailure(TInt aFunctionReturnValue,TInt aFunction) +// +// Simulate alloc failure +// + { + + + if (UserHeapAllocFailCount>=0 && (aFunctionReturnValue==KErrDiskFull || aFunctionReturnValue==KErrNoMemory)) + { + if (KernHeapAllocFailCount<20) + { + __KHEAP_FAILNEXT(++KernHeapAllocFailCount); + __UHEAP_FAILNEXT(UserHeapAllocFailCount); + } + else + { + KernHeapAllocFailCount=0; + __UHEAP_FAILNEXT(++UserHeapAllocFailCount); + __KHEAP_FAILNEXT(KernHeapAllocFailCount); + } + if (UserHeapAllocFailCount<100) + return; + } + if (UserHeapAllocFailCount>=0) + { + AllocPrint(aFunction); + UserHeapAllocFailCount=0; + KernHeapAllocFailCount=0; + __UHEAP_FAILNEXT(UserHeapAllocFailCount); + __KHEAP_FAILNEXT(KernHeapAllocFailCount); + } + } + +#else +TInt FsDebugFunction(CFsRequest* /*aRequest*/) +// +// Not in the release build +// + { + return KErrNotSupported; + } +#endif + +TInt TFsDebugFunc::DoRequestL(CFsRequest* aRequest) +// +// Not in the release build +// + { + return FsDebugFunction(aRequest); + } + +TInt TFsDebugFunc::Initialise(CFsRequest* /*aRequest*/) +// +// Not in the release build +// + { + return KErrNone; + } + +TInt TFsControlIo::DoRequestL(CFsRequest* aRequest) +// +// General purpose test interface - .FSY specific. +// Not in the release build +// + { + TInt command=aRequest->Message().Int1(); + TAny* param1=(TAny*)aRequest->Message().Ptr2(); + TAny* param2=(TAny*)aRequest->Message().Ptr3(); + + +#if defined(_DEBUG) || defined(_DEBUG_RELEASE) + switch(command) + { //These are non-drive commands + case KControlIoGetCorruptLogRecord: + { + // number of the log record to be retrieved (1-based) + TInt logRecNum=(TInt)param2; + TFsDebugCorruptLogRecordBuf logBuf; + TInt r=TCorruptLogRec::GetLogRecord(logBuf,logRecNum); + if(r!=KErrNone) + return r; + r=aRequest->Write(2,logBuf,0); + return r; + } + case KControlIoGetNumberOfCorruptLogRecords: + { + TPtrC8 ptrHits((TUint8*)&gNumberOfCorruptHits,sizeof(gNumberOfCorruptHits)); + TInt r=aRequest->Write(2,ptrHits,0); + + return r; + } + case KControlIoGetCorruptListFile: + { + // Get name of file that contains the filenames nominated as "corrupt" + TBuf8 fileName8; + if(gCorruptFileNamesListFile) + { + fileName8.Copy(*gCorruptFileNamesListFile); + } + else + { + fileName8.SetLength(0); + } + TInt r=aRequest->Write(2,fileName8,0); + return r; + } + case KControlIoCorruptLogRecordReset: + { + TCorruptLogRec::DestroyList(); + TCorruptNameRec::ResetListConsumed(); + return KErrNone; + } + case KControlIoCacheCount: + { + TIOCacheValues cacheValues; + cacheValues.iCloseCount= RequestAllocator::CloseCount(); + cacheValues.iFreeCount= RequestAllocator::FreeCount(); + cacheValues.iAllocated= RequestAllocator::AllocatedCount(); + cacheValues.iTotalCount= RequestAllocator::TotalCount(); + TPckgBuf pkgBuf(cacheValues); + + // ensure we only write what the client buffer can hold - + // this allows TIOCacheValues to increase in size without breaking BC + pkgBuf.SetLength(Min(pkgBuf.MaxLength(), aRequest->Message().GetDesMaxLengthL(2))); + + TInt r=aRequest->Write(2,pkgBuf); + return r; + } + case KControlIoGetLocalDriveNumber: + { + return DriveNumberToLocalDriveNumber(aRequest->Drive()->DriveNumber()); + } + case KControlIoCancelDeferredDismount: + { + // Cancel and clear deferred dismount information + aRequest->Drive()->ClearDeferredDismount(); + return KErrNone; + } + case KControlIoFileCacheStats: + { + CCacheManager* manager = CCacheManagerFactory::CacheManager(); + if (manager == NULL) + return KErrNotSupported; + + TFileCacheStats& stats = manager->Stats(); + + TPckgBuf pkgBuf(stats); + TInt r=aRequest->Write(2,pkgBuf); + return r; + } + case KControlIoFileCacheConfig: + { + TInt driveNumber = aRequest->Drive()->DriveNumber(); + + TFileCacheSettings::TFileCacheConfig* driveConfig = NULL; + TInt r = TFileCacheSettings::GetFileCacheConfig(driveNumber, driveConfig); + if (( r != KErrNone) || (driveConfig == NULL)) + return KErrNotSupported; + + TFileCacheConfig config; + config.iDrive = driveConfig->iDrive; + config.iFlags = driveConfig->iFlags; + config.iFileCacheReadAsync = driveConfig->iFileCacheReadAsync; + config.iFairSchedulingLen = driveConfig->iFairSchedulingLen; + config.iCacheSize = driveConfig->iCacheSize; + config.iMaxReadAheadLen = driveConfig->iMaxReadAheadLen; + config.iClosedFileKeepAliveTime = driveConfig->iClosedFileKeepAliveTime; + config.iDirtyDataFlushTime = driveConfig->iDirtyDataFlushTime; + + TPckgBuf pkgBuf(config); + r=aRequest->Write(2,pkgBuf); + return r; + } + case KControlIoFileCacheFlagsWrite: + { + TInt drive = aRequest->Message().Int0(); + + TPckgBuf driveFlagsPkg; + TFileCacheFlags& driveFlags = driveFlagsPkg(); + + TInt r = aRequest->Read(2, driveFlagsPkg); + if (r != KErrNone) + return r; + + __CACHE_PRINT2(_L("CACHE: TFileCacheFlags %x on drive %d"), driveFlags, drive); + TFileCacheSettings::SetFlags(drive, driveFlags); + + return r; + } + case KControlIoFlushClosedFiles: + { + TClosedFileUtils::Remove(); + return KErrNone; + } + case KControlIoSimulateLockFailureMode: + { + TPckgBuf enabledPkg; + TInt r = aRequest->Read(2, enabledPkg); + if (r != KErrNone) + return r; + + CCacheManager* manager = CCacheManagerFactory::CacheManager(); + if (manager == NULL) + return KErrNotSupported; + manager->SimulateLockFailureMode(enabledPkg()); + return KErrNone; + } + case KControlIoSimulateFileCacheWriteFailure: + { + CCacheManager* manager = CCacheManagerFactory::CacheManager(); + if (manager == NULL) + return KErrNotSupported; + manager->SimulateWriteFailure(); + return KErrNone; + } + case KControlIoFileCacheDump: + { + CCacheManager* manager = CCacheManagerFactory::CacheManager(); + if (manager == NULL) + return KErrNotSupported; + manager->DumpCache(); + return KErrNone; + } + case KControlIoAllocateMaxSegments: + { + TPckgBuf enabledPkg; + TInt r = aRequest->Read(2, enabledPkg); + if (r != KErrNone) + return r; + + CCacheManager* manager = CCacheManagerFactory::CacheManager(); + if (manager == NULL) + return KErrNotSupported; + manager->AllocateMaxSegments(enabledPkg()); + return KErrNone; + } + case KControlIoDisableFatUtilityFunctions: + { + EnableFatUtilityFunctions = EFalse; + return KErrNone; + } + case KControlIoEnableFatUtilityFunctions: + { + EnableFatUtilityFunctions = ETrue; + return KErrNone; + } + } +#endif + + return(aRequest->Drive()->ControlIO(aRequest->Message(),command,param1,param2)); + } + +TInt TFsControlIo::Initialise(CFsRequest* aRequest) +// +// General purpose test interface - .FSY specific. +// Not in the release build +// + { + TInt driveNumber=aRequest->Message().Int0(); + if(driveNumber<0||driveNumber>=KMaxDrives) + return(KErrArgument); + ValidateDriveDoSubst(driveNumber,aRequest); + return KErrNone; + } +