--- /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