diff -r 000000000000 -r a41df078684a kernel/eka/euser/us_shbuf.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/euser/us_shbuf.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,224 @@ +// Copyright (c) 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: +// e32/euser/us_shbuf.cpp +// Shareable Data Buffers + +#include "e32shbuf.h" +#include +#include + +EXPORT_C TShPoolInfo::TShPoolInfo() + { + memclr(this, sizeof(TShPoolInfo)); + } + + +EXPORT_C TShPoolCreateInfo::TShPoolCreateInfo(TShPoolPageAlignedBuffers aFlag, TUint aBufSize, TUint aInitialBufs) + { + iInfo.iBufSize = aBufSize; + iInfo.iInitialBufs = aInitialBufs; + iInfo.iFlags = aFlag; + iInfo.iAlignment = 0; + SetSizingAttributes(aInitialBufs, 0,0,0); + } + + +EXPORT_C TShPoolCreateInfo::TShPoolCreateInfo(TShPoolNonPageAlignedBuffers aFlag, TUint aBufSize, TUint aInitialBufs, TUint aAlignment) + { + iInfo.iBufSize = aBufSize; + iInfo.iInitialBufs = aInitialBufs; + iInfo.iAlignment = aAlignment; + iInfo.iFlags = aFlag; + SetSizingAttributes(aInitialBufs, 0,0,0); + } + + +EXPORT_C TInt TShPoolCreateInfo::SetSizingAttributes(TUint aMaxBufs, TUint aGrowTriggerRatio, + TUint aGrowByRatio, TUint aShrinkHysteresisRatio) + { + if (aGrowTriggerRatio == 0 || aGrowByRatio == 0) // No automatic growing/shrinking + { + aGrowTriggerRatio = aGrowByRatio = 0; + if (aMaxBufs != iInfo.iInitialBufs) + return KErrArgument; + } + else + { + // aGrowTriggerRatio must be < 1.0 (i.e. 256) + // aShrinkHysteresisRatio must be > 1.0 + if (aGrowTriggerRatio >= 256 || aShrinkHysteresisRatio <= 256) + return KErrArgument; + + if ((iInfo.iFlags & EShPoolContiguous) && (iInfo.iFlags & EShPoolNonPageAlignedBuffer)) + return KErrNotSupported; + } + + iInfo.iMaxBufs = aMaxBufs; + iInfo.iGrowTriggerRatio = aGrowTriggerRatio; + iInfo.iGrowByRatio = aGrowByRatio; + iInfo.iShrinkHysteresisRatio = aShrinkHysteresisRatio; + + return KErrNone; + } + + +EXPORT_C TInt TShPoolCreateInfo::SetExclusive() + { + iInfo.iFlags |= EShPoolExclusiveAccess; + + return KErrNone; + } + + +EXPORT_C TInt TShPoolCreateInfo::SetGuardPages() + { + iInfo.iFlags |= EShPoolGuardPages; + + return KErrNone; + } + + +EXPORT_C RShPool::RShPool() + { + memclr(this, sizeof(RShPool)); + } + + +EXPORT_C TInt RShPool::Create(const TShPoolCreateInfo& aInfo, TUint aFlags) + { + return SetReturnedHandle(Exec::ShPoolCreate(aInfo.iInfo, aFlags)); + } + + +EXPORT_C void RShBuf::Close() + { + if ((iHandle!=KNullHandle) && ((iHandle & CObjectIx::ENoClose)==0)) + { + iBase = 0; + iSize = 0; + + TInt h = iHandle; + iHandle=0; + Exec::HandleClose(h); + } + } + +EXPORT_C void RShPool::GetInfo(TShPoolInfo& aInfo) const + { + Exec::ShPoolGetInfo(iHandle, aInfo); + } + + +EXPORT_C TInt RShPool::SetBufferWindow(TInt aWindowSize, TBool aAutoMap) + { + return Exec::ShPoolBufferWindow(iHandle, aWindowSize, aAutoMap); + } + + +EXPORT_C TUint RShPool::FreeCount() const + { + return Exec::ShPoolFreeCount(iHandle); + } + + +EXPORT_C void RShPool::RequestLowSpaceNotification(TUint aThreshold, TRequestStatus& aStatus) + { + aStatus = KRequestPending; + Exec::ShPoolNotification(iHandle, EShPoolLowSpace, aThreshold, aStatus); + } + + +EXPORT_C void RShPool::RequestFreeSpaceNotification(TUint aThreshold, TRequestStatus& aStatus) + { + aStatus = KRequestPending; + Exec::ShPoolNotification(iHandle, EShPoolFreeSpace, aThreshold, aStatus); + } + + +EXPORT_C void RShPool::CancelLowSpaceNotification(TRequestStatus& aStatus) + { + Exec::ShPoolNotificationCancel(iHandle, EShPoolLowSpace, aStatus); + } + + +EXPORT_C void RShPool::CancelFreeSpaceNotification(TRequestStatus& aStatus) + { + Exec::ShPoolNotificationCancel(iHandle, EShPoolFreeSpace, aStatus); + } + + +EXPORT_C TInt RShBuf::Alloc(RShPool& aPool, TUint aFlags) + { + SShBufBaseAndSize bs; + + TInt handle = Exec::ShPoolAlloc(aPool.Handle(), aFlags, bs); + + TInt r = SetReturnedHandle(handle); + + if (r == KErrNone) + { + iBase = bs.iBase; + iSize = bs.iSize; + } + + return r; + } + + +EXPORT_C TInt RShBuf::Map(TBool aReadOnly) + { + SShBufBaseAndSize bs; + TInt r = Exec::ShBufMap(iHandle, aReadOnly, bs); + + if (r == KErrNone) + { + iBase = bs.iBase; + iSize = bs.iSize; + } + return r; + } + + +EXPORT_C TInt RShBuf::UnMap() + { + return Exec::ShBufUnMap(iHandle); + } + + +EXPORT_C TUint8* RShBuf::Ptr() + { + // if iBase is null RShBuf has not been intialised + if (iBase == 0) + { + SShBufBaseAndSize bs; + Exec::ShBufBaseAndSize(iHandle, bs); + iBase = bs.iBase; + iSize = bs.iSize; + } + return reinterpret_cast(iBase); + } + + +EXPORT_C TUint RShBuf::Size() + { + // if iBase is null RShBuf has not been intialised + if (iBase == 0) + { + SShBufBaseAndSize bs; + Exec::ShBufBaseAndSize(iHandle, bs); + iBase = bs.iBase; + iSize = bs.iSize; + } + return iSize; + }