diff -r e375a7921169 -r 57c618273d5c fbs/fontandbitmapserver/sfbs/FBSBMP.CPP --- a/fbs/fontandbitmapserver/sfbs/FBSBMP.CPP Thu Jul 15 20:08:02 2010 +0300 +++ b/fbs/fontandbitmapserver/sfbs/FBSBMP.CPP Thu Aug 19 11:11:18 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 1995-2010 Nokia Corporation and/or its subsidiary(-ies). // All rights reserved. // This component and the accompanying materials are made available // under the terms of "Eclipse Public License v1.0" @@ -25,6 +25,11 @@ #include "BitwiseBitmap.inl" #include "fbsmessage.h" #include "bitmapconst.h" +#include "OstTraceDefinitions.h" +#include "fbstrace.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "FBSBMPTraces.h" +#endif const TInt KMaxPixelSize = KMaxTInt / 4; // Maximum pixel size to avoid some overflow problems const TInt KMaxBitmapHandleBufferSize = KNumBytesPerBitmapHandle * 2000; // Maximum size of buffer to store all bitmap handles. @@ -95,6 +100,8 @@ */ EXPORT_C void CFbsBitmap::Reset() { + FBS_OST(TInt ssh = (iFbs ? iFbs->ServerSessionHandle() : 0);) + FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_RESET_ENTRY, "> this=0x%08x; iH=0x%08x; iSH=0x%08x; iSSH=0x%08x", (TUint)this, iHandle, iServerHandle, ssh );) if (iHandle && !(iFlags & EIsRomBitmap)) { iFbs->SendCommand(EFbsMessClose, iHandle, Handle()); @@ -114,6 +121,7 @@ iUseCount = 0; iHandle = 0; iServerHandle = 0; + FBS_OST(OstTrace1( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_RESET_EXIT, "< this=0x%08x", (TUint)this );) } /** Tests whether or not the bitmap is read-only. @@ -254,7 +262,11 @@ */ EXPORT_C TInt CFbsBitmap::Create(const TSize& aSizeInPixels,TDisplayMode aDispMode) { - return DoCreate(aSizeInPixels,aDispMode,KUidCFbsBitmapCreation); + FBS_OST(OstTraceExt4(GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATE_ENTRY, "> this=0x%08x; w=%d; h=%d; dm=%d", (TUint)this, aSizeInPixels.iWidth, aSizeInPixels.iHeight, aDispMode); ) + TInt err = DoCreate(aSizeInPixels,aDispMode,KUidCFbsBitmapCreation); + FBS_OST(TInt ssh = (iFbs ? iFbs->ServerSessionHandle() : 0);) + FBS_OST(OstTraceExt5(GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATE_EXIT, "< this=0x%08x; err=%d; iH=0x%08x; iSH=0x%08x; iSSH=0x%08x", (TUint)this, err, iHandle, iServerHandle, ssh); ) + return err; } TInt CFbsBitmap::DoCreate(const TSize& aSizeInPixels, TDisplayMode aDispMode, TUid aUid, TInt aDataSize) @@ -305,7 +317,11 @@ */ EXPORT_C TInt CFbsBitmap::CreateHardwareBitmap(const TSize& aSizeInPixels,TDisplayMode aDispMode,TUid aCreatorUid) { - return DoCreate(aSizeInPixels,aDispMode,aCreatorUid); + FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATEHARDWAREBITMAP_ENTRY, "> this=0x%08x; w=%d; h=%d; dm=%d; uid=0x%08x", (TUint)this, aSizeInPixels.iWidth, aSizeInPixels.iHeight, aDispMode, aCreatorUid.iUid);) + TInt err = DoCreate(aSizeInPixels,aDispMode,aCreatorUid); + FBS_OST(TInt ssh = (iFbs ? iFbs->ServerSessionHandle() : 0);) + FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATEHARDWAREBITMAP_EXIT, "< this=0x%08x; err=%d; iH=0x%08x; iSH=0x%08x; iSSH=0x%08x", (TUint)this, err, iHandle, iServerHandle, ssh);) + return err; } /** Resets the pixel-size of the bitmap. @@ -406,53 +422,105 @@ @released @see CFbsBitmap::Handle() */ -EXPORT_C TInt CFbsBitmap::Duplicate(TInt aBitmapHandle) - { +EXPORT_C TInt CFbsBitmap::Duplicate(TInt aBitmapHandle) + { + TInt ret = KErrNone; + FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_DUPLICATE_ENTRY, "> this=0x%08x; iH=0x%08x;", (TUint)this, aBitmapHandle);) if(!iFbs) { - return(KErrCouldNotConnect); + ret = KErrCouldNotConnect; + FBS_OST(OstTrace1( TRACE_ERROR, CFBSBITMAP_DUPLICATE_ERROR, "! this=0x%08x; !iFbs", (TUint)this);) } - if(!aBitmapHandle) - { - return(KErrUnknown); - } - Reset(); - TBool isinrom=EFalse; - TInt ret=User::IsRomAddress(isinrom,(TAny*)aBitmapHandle); - if(ret!=KErrNone) + else if(!aBitmapHandle) { - return(KErrUnknown); - } - if(isinrom) - { - if (((CBitwiseBitmap*)aBitmapHandle)->Uid() != KCBitwiseBitmapUid) - return(KErrUnknown); - iAddressPointer = (CBitwiseBitmap*)aBitmapHandle; - iFlags = EIsRomBitmap; - iHandle=1; - return iFbs->AllocScanLineBuffer(iAddressPointer->iByteWidth + 4); + ret = KErrUnknown; + FBS_OST(OstTrace1( TRACE_ERROR, CFBSBITMAP_DUPLICATE_ERROR2, "! this=0x%08x; !aBitmapHandle", (TUint)this);) } - TPckgBuf b; - TIpcArgs args(aBitmapHandle,&b); - ret=iFbs->SendCommand(EFbsMessBitmapDuplicate,args); - if(ret!=KErrNone) - { - return(ret); - } - iHandle=b().iHandle; - iServerHandle=b().iServerHandle; - iAddressPointer=(CBitwiseBitmap*)(iFbs->HeapBase()+b().iAddressOffset); - if (iAddressPointer->iUid.iUid != KCBitwiseBitmapUid.iUid && iAddressPointer->iUid.iUid != KCBitwiseBitmapHardwareUid.iUid) - { - iFlags = EIsExtendedBitmap; - } - ret = iFbs->iHelper->AddBitmap(*this); - if (ret != KErrNone) - { - return ret; - } - return iFbs->AllocScanLineBuffer(iAddressPointer->iByteWidth+4); - } + else + { + TBool isinrom = EFalse; + ret = User::IsRomAddress(isinrom, (TAny*)aBitmapHandle); + if (ret == KErrNone) + { + if (isinrom) + { + ret = DuplicateInRom(aBitmapHandle); + FBS_OST_IF(ret != KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATE_ERROR4, "! this=0x%08x; DuplicateInRom() returned %d;", (TUint)this, ret);) + } + else + { + ret = DuplicateInRam(aBitmapHandle); + FBS_OST_IF(ret != KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATE_ERROR5, "! this=0x%08x; DuplicateInRam() returned %d;", (TUint)this, ret);) + } + } + else + { + FBS_OST(OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATE_ERROR3, "! this=0x%08x; IsRomAddress() returned %d", (TUint)this, ret);) + ret = KErrUnknown; + } + } + FBS_OST(TInt ssh = (iFbs ? iFbs->ServerSessionHandle() : 0);) + FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_DUPLICATE_EXIT, "< this=0x%08x; iH=0x%08x; iSH=0x%08x; ret=%d; iSSH=0x%08x", (TUint)this, iHandle, iServerHandle, ret, ssh);) + return ret; + } + +/** Duplicates a bitmap where the bitmap handle refers to a rom bitmap. +@param aBitmapHandle A valid Rom bitmap handle. +@return KErrNone on success. + */ +TInt CFbsBitmap::DuplicateInRom(TInt aBitmapHandle) + { + TInt ret = KErrNone; + Reset(); + TUid uid = ((CBitwiseBitmap*)aBitmapHandle)->Uid(); + if (uid != KCBitwiseBitmapUid) + { + FBS_OST(OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATEINROM_ERROR, "! this=0x%08x; 0x%08x != KCBitwiseBitmapUid", (TUint)this, (TUint)uid.iUid);) + ret = KErrUnknown; + } + else + { + iAddressPointer = (CBitwiseBitmap*)aBitmapHandle; + iFlags = EIsRomBitmap; + iHandle=1; + ret = iFbs->AllocScanLineBuffer(iAddressPointer->iByteWidth + 4); + FBS_OST_IF(ret!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATEINROM_ERROR2, "! this=0x%08x; AllocScanLineBuffer() returned %d", (TUint)this, ret);) + } + return ret; + } + +/** Duplicates a bitmap where the bitmap handle refers to a ram bitmap +@param aBitmapHandle A valid Ram bitmap handle. +@return KErrNone on success. + */ +TInt CFbsBitmap::DuplicateInRam(TInt aBitmapHandle) + { + TInt ret = KErrNone; + Reset(); + + TPckgBuf b; + TIpcArgs args(aBitmapHandle,&b); + ret=iFbs->SendCommand(EFbsMessBitmapDuplicate,args); + FBS_OST_IF(ret!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATEINRAM_ERROR, "! this=0x%08x; SendCommand(EFbsMessBitmapDuplicate) returned %d", (TUint)this, ret);) + if(ret==KErrNone) + { + iHandle=b().iHandle; + iServerHandle=b().iServerHandle; + iAddressPointer=(CBitwiseBitmap*)(iFbs->HeapBase()+b().iAddressOffset); + if (iAddressPointer->iUid.iUid != KCBitwiseBitmapUid.iUid && iAddressPointer->iUid.iUid != KCBitwiseBitmapHardwareUid.iUid) + { + iFlags = EIsExtendedBitmap; + } + ret = iFbs->iHelper->AddBitmap(*this); + FBS_OST_IF(ret!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATEINRAM_ERROR2, "! this=0x%08x; AddBitmap() returned %d", (TUint)this, ret);) + if (ret == KErrNone) + { + ret = iFbs->AllocScanLineBuffer(iAddressPointer->iByteWidth+4); + FBS_OST_IF(ret!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATEINRAM_ERROR3, "! this=0x%08x; AllocScanLineBuffer() returned %d", (TUint)this, ret);) + } + } + return ret; + } /** Loads a specific bitmap from a multi-bitmap file. The bitmap may be shared by other font and bitmap server clients. @@ -467,7 +535,10 @@ */ EXPORT_C TInt CFbsBitmap::Load(const TDesC& aFileName,TInt32 aId,TBool aShareIfLoaded) { - return Load(aFileName,aId,aShareIfLoaded,0); + FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD_ENTRY, "> this=0x%08x; file=%S, id=0x%08x; share=%d", (TUint)this, aFileName, aId, aShareIfLoaded);) + TInt err = Load(aFileName,aId,aShareIfLoaded,0); + FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD_EXIT, "< this=0x%08x; err=%d", (TUint)this, err);) + return err; } /** Loads a specific bitmap from a multi-bitmap file. @@ -483,38 +554,50 @@ */ EXPORT_C TInt CFbsBitmap::Load(const TDesC& aFileName,TInt32 aId,TBool aShareIfLoaded,TUint aFileOffset) { + TInt err = KErrNone; + FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD2_ENTRY, "> this=0x%08x; file=%S, id=0x%08x; share=%d; off=%d", (TUint)this, aFileName, aId, aShareIfLoaded, aFileOffset);) if(!iFbs) { - return(KErrCouldNotConnect); - } - Reset(); - TUint32* rompointer = NULL; - //access using filename has the advantage of using rom address lookup cache - IsFileInRom(aFileName, rompointer); - TBool romPointerValid; - TInt err = DoLoadFromRom(rompointer, aId, aFileOffset, romPointerValid); - if(romPointerValid) - { - return err; - } - _LIT(KResourcePath, "?:\\Resource\\*"); - TInt match = aFileName.MatchF(KResourcePath); - //if the file is in the resource directory we don't need to check capabilities and the file can just be opened on the server side. - if (match == 0) - { - err = DoLoad(aFileName,aId,aShareIfLoaded,aFileOffset); + FBS_OST(OstTrace1( TRACE_ERROR, CFBSBITMAP_LOAD2_ERROR, "! this=0x%08x; !iFbs", (TUint)this);) + err = KErrCouldNotConnect; } else - { - RFile file; - err = file.Open(iFbs->FileServer(),aFileName,EFileShareReadersOnly); - if (err!=KErrNone) - { - return err; - } - err = DoLoad(file,aId,aShareIfLoaded,aFileOffset); - file.Close(); - } + { + Reset(); + TUint32* rompointer = NULL; + //access using filename has the advantage of using rom address lookup cache + IsFileInRom(aFileName, rompointer); + TBool romPointerValid; + err = DoLoadFromRom(rompointer, aId, aFileOffset, romPointerValid); + if(romPointerValid) + { + FBS_OST(OstTrace1( TRACE_ERROR, CFBSBITMAP_LOAD2_ERROR2, "! this=0x%08x; romPointerValid", (TUint)this);) + err = KErrCouldNotConnect; + } + else + { + _LIT(KResourcePath, "?:\\Resource\\*"); + TInt match = aFileName.MatchF(KResourcePath); + //if the file is in the resource directory we don't need to check capabilities and the file can just be opened on the server side. + if (match == 0) + { + err = DoLoad(aFileName,aId,aShareIfLoaded,aFileOffset); + FBS_OST_IF(err!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_LOAD2_ERROR3, "! this=0x%08x; DoLoad returned %d", (TUint)this, err);) + } + else + { + RFile file; + err = file.Open(iFbs->FileServer(),aFileName,EFileShareReadersOnly); + if (err==KErrNone) + { + err = DoLoad(file,aId,aShareIfLoaded,aFileOffset); + FBS_OST_IF(err!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_LOAD2_ERROR4, "! this=0x%08x; DoLoad returned %d", (TUint)this, err);) + } + file.Close(); + } + } + } + FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD2_EXIT, "< this=0x%08x; err=%d", (TUint)this, err);) return err; } @@ -532,7 +615,10 @@ */ EXPORT_C TInt CFbsBitmap::LoadAndCompress(const TDesC& aFileName,TInt32 aId,TBool aShareIfLoaded) { - return LoadAndCompress(aFileName, aId, aShareIfLoaded, 0); + FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS_ENTRY, "> this=0x%08x; file=%S; id=0x%08x; share=%d", (TUint)this, aFileName, aId, aShareIfLoaded);) + TInt ret = LoadAndCompress(aFileName, aId, aShareIfLoaded, 0); + FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS_EXIT, "< this=0x%08x; err=%d", (TUint)this, ret);) + return ret; } /** Loads and compresses a specific bitmap from a multi-bitmap file. @@ -549,12 +635,15 @@ @released */ EXPORT_C TInt CFbsBitmap::LoadAndCompress(const TDesC& aFileName,TInt32 aId,TBool aShareIfLoaded,TUint aFileOffset) - { + { + FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS2_ENTRY, "> this=0x%08x; file=%S, id=0x%08x; share=%d; off=%d", (TUint)this, aFileName, aId, aShareIfLoaded, aFileOffset);) TInt err = Load(aFileName,aId,aShareIfLoaded,aFileOffset); if (err == KErrNone) { err = !(iFlags & EIsRomBitmap) ? Compress() : KErrAccessDenied; + FBS_OST_IF(err!=KErrNone, OstTraceExt3( TRACE_ERROR, CFBSBITMAP_LOADANDCOMPRESS2_ERROR, "! this=0x%08x; iFlags=0x%08x; err=%d", (TUint)this, (TUint)iFlags, err);) } + FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS2_EXIT, "< this=0x%08x; err=%d", (TUint)this, err);) return err; } @@ -1151,7 +1240,7 @@ CBitwiseBitmap* bitmap = CleanAddress(); if (bitmap==NULL) { - return EFalse; + return EFalse; } return bitmap->IsCompressedInRAM(); } @@ -1250,10 +1339,16 @@ */ EXPORT_C void CFbsBitmap::BeginDataAccess() const { - if (!iHandle) - return; - (void)CleanAddress(); //called for side-effect to make sure bitmap reference is current. Should be low overhead. - const_cast(this)->iUseCount++; + FBS_OST_VERBOSE(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_BEGINDATAACCESS_ENTRY, "> this=0x%08x;", (TUint)this);); + FBS_OST_IF(!iHandle, OstTrace1(TRACE_ERROR, CFBSBITMAP_BEGINDATAACCESS_ERROR, "! this=0x%08x; !iHandle", (TUint)this);); + + if (iHandle) + { + (void)CleanAddress(); //called for side-effect to make sure bitmap reference is current. Should be low overhead. + const_cast(this)->iUseCount++; + } + + FBS_OST_VERBOSE(OstTraceExt2(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_BEGINDATAACCESS_EXIT, "< this=0x%08x; iUseCount=%d;", (TUint)this, const_cast(this)->iUseCount);) } /** Marks the end of direct access to the bitmap data. @@ -1271,11 +1366,17 @@ */ EXPORT_C void CFbsBitmap::EndDataAccess(TBool aReadOnly) const { - if (!iHandle) - return; - const_cast(this)->iUseCount--; - if (!aReadOnly && !(iFlags & EIsReadOnlyBitmapMask)) - User::LockedInc(iAddressPointer->Extra()->iTouchCount); + FBS_OST_VERBOSE(OstTraceExt2(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_ENDDATAACCESS_ENTRY, "> this=0x%08x; aReadOnly=%d;", (TUint)this, (TUint)aReadOnly);) + FBS_OST_IF(!iHandle, OstTrace1(TRACE_ERROR, CFBSBITMAP_ENDDATAACCESS_ERROR, "! this=0x%08x; !iHandle", (TUint)this);); + if (iHandle) + { + const_cast(this)->iUseCount--; + if (!aReadOnly && !(iFlags & EIsReadOnlyBitmapMask)) + { + User::LockedInc(iAddressPointer->Extra()->iTouchCount); + } + } + FBS_OST_VERBOSE(OstTraceExt2(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_ENDDATAACCESS_EXIT, "< this=0x%08x; iUseCount=%d;", (TUint)this, const_cast(this)->iUseCount);) } /** Locks the global bitmap heap. @@ -1299,12 +1400,12 @@ */ EXPORT_C void CFbsBitmap::LockHeap(TBool /*aAlways*/) const { + FBS_OST(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_LOCKHEAP_ENTRY, "> this=0x%08x;", (TUint)this);) BeginDataAccess(); #ifdef SYMBIAN_DEBUG_FBS_LOCKHEAP //These debug checks now refer to the cleaned data address - if (!iHandle) - return; - if (!(iFlags & EIsRomBitmap)) // can't do anything with ROM bitmaps + FBS_OST_IF(!iHandle, OstTrace1(TRACE_ERROR, CFBSBITMAP_LOCKHEAP_ERROR, "! this=0x%08x; !iHandle", (TUint)this);); + if (iHandle && !(iFlags & EIsRomBitmap)) // can't do anything with ROM bitmaps { TThreadId threadId = RThread().Id(); iFbs->iHelper->iDebugMutex.Wait(); @@ -1318,6 +1419,7 @@ iFbs->iHelper->iDebugMutex.Signal(); } #endif + FBS_OST(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_LOCKHEAP_EXIT, "< this=0x%08x;", (TUint)this);) } /** Unlocks the global heap. @@ -1332,21 +1434,25 @@ */ EXPORT_C void CFbsBitmap::UnlockHeap(TBool /*aAlways*/) const { + FBS_OST(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_UNLOCKHEAP_ENTRY, "> this=0x%08x;", (TUint)this);) + FBS_OST_IF(!iHandle, OstTrace1(TRACE_ERROR, CFBSBITMAP_UNLOCKHEAP_ERROR, "! this=0x%08x; !iHandle", (TUint)this);); + if (iHandle) + { #ifdef SYMBIAN_DEBUG_FBS_LOCKHEAP - if (!iHandle) - return; - if (!(iFlags & EIsRomBitmap)) // can't do anything with ROM bitmaps - { - TThreadId threadId = RThread().Id(); - iFbs->iHelper->iDebugMutex.Wait(); - __ASSERT_ALWAYS(iAddressPointer->Extra()->iLockCount > 0, Panic(EFbsPanicBadHeapLock)); - __ASSERT_ALWAYS(iAddressPointer->Extra()->iThreadId == threadId, Panic(EFbsPanicBadHeapLock)); - if (--iAddressPointer->Extra()->iLockCount == 0) - iAddressPointer->Extra()->iThreadId = TThreadId(KNullThreadId); - iFbs->iHelper->iDebugMutex.Signal(); - } + if (!(iFlags & EIsRomBitmap)) // can't do anything with ROM bitmaps + { + TThreadId threadId = RThread().Id(); + iFbs->iHelper->iDebugMutex.Wait(); + __ASSERT_ALWAYS(iAddressPointer->Extra()->iLockCount > 0, Panic(EFbsPanicBadHeapLock)); + __ASSERT_ALWAYS(iAddressPointer->Extra()->iThreadId == threadId, Panic(EFbsPanicBadHeapLock)); + if (--iAddressPointer->Extra()->iLockCount == 0) + iAddressPointer->Extra()->iThreadId = TThreadId(KNullThreadId); + iFbs->iHelper->iDebugMutex.Signal(); + } #endif - EndDataAccess(); + EndDataAccess(); + } + FBS_OST(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_UNLOCKHEAP_EXIT, "< this=0x%08x;", (TUint)this);) } /** Locks the global bitmap heap, leaving on the clean-up stack a pointer @@ -1362,14 +1468,18 @@ */ EXPORT_C void CFbsBitmap::LockHeapLC(TBool /*aAlways*/) const { - LockHeap(); + FBS_OST(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_LOCKHEAPLC_ENTRY, "> this=0x%08x;", (TUint)this);) + LockHeap(); TCleanupItem cleanitem(CFbsBitmap::UnlockHeap, (TAny*)this); CleanupStack::PushL(cleanitem); + FBS_OST(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_LOCKHEAPLC_EXIT, "< this=0x%08x;", (TUint)this);) } EXPORT_C void CFbsBitmap::UnlockHeap(TAny* aFbsBitmap) { - ((CFbsBitmap*)aFbsBitmap)->UnlockHeap(); + FBS_OST(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_UNLOCKHEAP2_ENTRY, "> bitmap=0x%08x;", (TUint)aFbsBitmap);) + ((CFbsBitmap*)aFbsBitmap)->UnlockHeap(); + FBS_OST(OstTrace0(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_UNLOCKHEAP2_EXIT, "<");) } /** Tests whether the bitmap is volatile. @@ -1398,7 +1508,7 @@ EXPORT_C TInt CFbsBitmap::TouchCount() const { if (!iHandle || (iFlags & EIsReadOnlyBitmapMask)) - return 0; // A read-only bitmap can never be touched. + return 0; // A read-only bitmap can never be touched. return CleanAddress()->Extra()->iTouchCount; } @@ -1723,7 +1833,12 @@ */ EXPORT_C TInt CFbsBitmap::Load(RFile& aFile,TInt32 aId/*=0*/,TBool aShareIfLoaded/*=ETrue*/) { - return Load(aFile,aId,aShareIfLoaded,0); + FBS_OST(TFullName fileName;) + FBS_OST(aFile.FullName(fileName);) + FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD3_ENTRY, "> this=0x%08x; file=%S; id=0x%08x; share=%d", (TUint)this, fileName, aId, aShareIfLoaded);) + TInt ret = Load(aFile,aId,aShareIfLoaded,0); + FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD3_EXIT, "< this=0x%08x, ret=%d", (TUint)this, ret);) + return ret; } /** Loads a specific bitmap from an opened multi-bitmap file handle. @@ -1739,19 +1854,29 @@ */ EXPORT_C TInt CFbsBitmap::Load(RFile& aFile,TInt32 aId,TBool aShareIfLoaded,TUint aFileOffset) { + TInt err = KErrNone; + FBS_OST(TFullName fileName;) + FBS_OST(aFile.FullName(fileName);) + FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD4_ENTRY, "> this=0x%08x; file=%S; id=0x%08x; share=%d; off=%d", (TUint)this, fileName, aId, aShareIfLoaded, aFileOffset);) if (!iFbs) { - return(KErrCouldNotConnect); + FBS_OST(OstTrace1( TRACE_ERROR, CFBSBITMAP_LOAD4_ERROR, "! this=0x%08x; !iFbs", (TUint)this);) + err = KErrCouldNotConnect; } - Reset(); - TUint32* rompointer; - IsFileInRom(aFile,rompointer); - TBool romPointerValid; - TInt err = DoLoadFromRom(rompointer, aId, aFileOffset, romPointerValid); - if (!romPointerValid) - { - err = DoLoad(aFile,aId,aShareIfLoaded,aFileOffset); - } + else + { + Reset(); + TUint32* rompointer; + IsFileInRom(aFile,rompointer); + TBool romPointerValid; + err = DoLoadFromRom(rompointer, aId, aFileOffset, romPointerValid); + if (!romPointerValid) + { + err = DoLoad(aFile,aId,aShareIfLoaded,aFileOffset); + FBS_OST_IF(err!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_LOAD4_ERROR2, "! this=0x%08x; DoLoad() returned %d", (TUint)this, err);) + } + } + FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD4_EXIT, "< this=0x%08x; err=%d", (TUint)this, err);) return err; } @@ -1769,7 +1894,12 @@ */ EXPORT_C TInt CFbsBitmap::LoadAndCompress(RFile& aFile,TInt32 aId/*=0*/,TBool aShareIfLoaded/*=ETrue*/) { - return LoadAndCompress(aFile,aId,aShareIfLoaded,0); + FBS_OST(TFullName fileName;) + FBS_OST(aFile.FullName(fileName);) + FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS3_ENTRY, "> this=0x%08x; file=%S; id=0x%08x; share=%d", (TUint)this, fileName, aId, aShareIfLoaded);) + TInt ret = LoadAndCompress(aFile,aId,aShareIfLoaded,0); + FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS3_EXIT, "< this=0x%08x; ret=%d", (TUint)this, ret);) + return ret; } /** Loads and compresses a specific bitmap from an opened multi-bitmap file handle. @@ -1787,11 +1917,24 @@ */ EXPORT_C TInt CFbsBitmap::LoadAndCompress(RFile& aFile,TInt32 aId,TBool aShareIfLoaded,TUint aFileOffset) { + FBS_OST(TFullName fileName;) + FBS_OST(aFile.FullName(fileName);) + FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS4_ENTRY, "> this=0x%08x; file=%S; id=0x%08x; share=%d", (TUint)this, fileName, aId, aShareIfLoaded);) TInt err = Load(aFile,aId,aShareIfLoaded,aFileOffset); if (err == KErrNone) { - err = !(iFlags & EIsRomBitmap) ? Compress() : KErrAccessDenied; + if (!(iFlags & EIsRomBitmap)) + { + err = Compress(); + FBS_OST_IF(err!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_LOADANDCOMPRESS4_ERROR, "! this=0x%08x; Compress() returned %d", (TUint)this, err);) + } + else + { + err = KErrAccessDenied; + FBS_OST(OstTraceExt2( TRACE_ERROR, CFBSBITMAP_LOADANDCOMPRESS4_ERROR2, "! this=0x%08x; Cannot compress bitmap in ROM; iFlags=0x%08x", (TUint)this, (TUint)iFlags);) + } } + FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS4_EXIT, "< this=0x%08x; err=%d", (TUint)this, err);) return err; } @@ -1908,15 +2051,22 @@ */ EXPORT_C TInt CFbsBitmap::CreateExtendedBitmap(const TSize& aSizeInPixels, TDisplayMode aDispMode, TUid aType, const TAny* aData, TInt aDataSize) { + TInt err; + FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATEEXTENDEDBITMAP_ENTRY, "> this=0x%08x; w=%d; h=%d; dm=%d; type=0x%08x", (TUint)this, aSizeInPixels.iWidth, aSizeInPixels.iHeight, aDispMode, aType.iUid);) if (!aData || aDataSize == 0) { - return KErrArgument; + FBS_OST(OstTrace1( TRACE_ERROR, CFBSBITMAP_CREATEEXTENDEDBITMAP_ERROR, "! this=0x%08x; (!aData || aDataSize == 0)", (TUint)this);) + err = KErrArgument; } - TInt err = DoCreate(aSizeInPixels, aDispMode, aType, aDataSize); - if (err == KErrNone) - { - Mem::Copy(iFbs->iLargeBitmapChunk.Base() + iAddressPointer->iDataOffset, aData, aDataSize); - } + else + { + err = DoCreate(aSizeInPixels, aDispMode, aType, aDataSize); + if (err == KErrNone) + { + Mem::Copy(iFbs->iLargeBitmapChunk.Base() + iAddressPointer->iDataOffset, aData, aDataSize); + } + } + FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATEEXTENDEDBITMAP_EXIT, "< this=0x%08x; err=%d; iH=0x%08x; iSH=0x%08x", (TUint)this, err, iHandle, iServerHandle);) return err; } @@ -1960,19 +2110,26 @@ */ EXPORT_C TInt CFbsBitmap::CreateExtendedBitmap(const TSize& aSizeInPixels, TDisplayMode aDispMode, TUid aType, TInt aDataSize, MFbsExtendedBitmapInitializer& aInitializer) { + TInt err; + FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATEEXTENDEDBITMAP2_ENTRY, "> this=0x%08x; w=%d; h=%d; dm=%d; type=0x%08x;", (TUint)this, aSizeInPixels.iWidth, aSizeInPixels.iHeight, aDispMode, aType.iUid);) if (aDataSize == 0) { - return KErrArgument; + FBS_OST(OstTrace1( TRACE_ERROR, CFBSBITMAP_CREATEEXTENDEDBITMAP2_ERROR, "! this=0x%08x; aDataSize == 0", (TUint)this);) + err = KErrArgument; } - TInt err = DoCreate(aSizeInPixels, aDispMode, aType, aDataSize); - if (err == KErrNone) - { - err = aInitializer.InitExtendedBitmap(iFbs->iLargeBitmapChunk.Base() + iAddressPointer->iDataOffset, aDataSize); - if (err != KErrNone) - { - Reset(); - } - } + else + { + err = DoCreate(aSizeInPixels, aDispMode, aType, aDataSize); + if (err == KErrNone) + { + err = aInitializer.InitExtendedBitmap(iFbs->iLargeBitmapChunk.Base() + iAddressPointer->iDataOffset, aDataSize); + if (err != KErrNone) + { + Reset(); + } + } + } + FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATEEXTENDEDBITMAP2_EXIT, "< this=0x%08x; err=%d; iH=0x%08x; iSH=0x%08x", (TUint)this, err, iHandle, iServerHandle);) return err; }