diff -r 000000000000 -r a41df078684a kernel/eka/memmodel/epoc/flexible/mmu/maddrcont.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/memmodel/epoc/flexible/mmu/maddrcont.h Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,134 @@ +// Copyright (c) 2007-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: +// + +#ifndef MADDRCONT_H +#define MADDRCONT_H + +/** +A container for storing objects keyed on a virtual address. +*/ +class RAddressedContainer + { +public: + /** + @param aReadLock Fast mutex used to synchronise read operations, + i.e. the Find functions. This may be the null pointer to + indicate that extra locking is required. + @param aWriteLock Reference to the mutex used to synchronise write operations, + i.e. #Add and Remove functions. This mutex if not used by + the RAddressedContainer class but it is used for asserting + correct preconditions in debug builds + */ + RAddressedContainer(NFastMutex* aReadLock, DMutex*& aWriteLock); + + ~RAddressedContainer(); + + /** + Add an object to the container. + + @param aAddress The address key for the object. + @param aObject Pointer to the object to add. This may not be the null pointer. + + @pre The write lock must be held. + */ + TInt Add(TLinAddr aAddress, TAny* aObject); + + /** + Remove an object from the container. + + @param aAddress The address key for the object. + + @return The pointer of the object removed, or the null pointer if there + was none with the specified address key. + + @pre The write lock must be held. + */ + TAny* Remove(TLinAddr aAddress); + + /** + Find an object in the container. + + @param aAddress The address key for the object. + + @return The pointer of the object found, or the null pointer if there + was none with the specified address key. + + @pre The read lock must be held, or if there is no read lock, the write lock must be held. + */ + TAny* Find(TLinAddr aAddress); + + /** + Find the object in the container which has the highest value + address key less-than-or-equal to the specified address. + + @param aAddress The address key to search on. + + @param[out] aOffset Reference to an value which will be set to the difference + between \a aAddress and the address key of the found object. + + @return The pointer of the object found, or the null pointer if there + was none matching the search criteria. + + @pre The read lock must be held, or if there is no read lock, the write lock must be held. + */ + TAny* Find(TLinAddr aAddress, TUint& aOffset); + + /** Acquire the read lock. */ + FORCE_INLINE void ReadLock() + { + if(iReadLock) + NKern::FMWait(iReadLock); + } + + /** Release the read lock. */ + FORCE_INLINE void ReadUnlock() + { + if(iReadLock) + NKern::FMSignal(iReadLock); + } + + /** Flash (release and re-acquire) the read lock. */ + FORCE_INLINE void ReadFlash() + { + if(iReadLock) + NKern::FMFlash(iReadLock); + } + + /** The number of objects in the container. */ + FORCE_INLINE TUint Count() + { + return iCount; + } +private: + TUint FindIndex(TLinAddr aAddress); + TUint CalculateGrow(); + TUint CalculateShrink(TUint aCount); + TBool CheckWriteLock(); + + class TEntry + { + public: + TLinAddr iAddress; + TAny* iObject; + }; +private: + TUint iMaxCount; + TUint iCount; + TEntry* iList; + NFastMutex* iReadLock; + DMutex*& iWriteLock; + }; + +#endif // MADDRCONT_H