kernel/eka/memmodel/epoc/flexible/mmu/maddrcont.h
changeset 0 a41df078684a
--- /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