--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/userlibandfileserver/fileserver/sfile/sf_pool.cpp Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,124 @@
+// 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:
+// f32\sfile\sf_pool.cpp
+//
+//
+
+#include "sf_pool.h"
+#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
+#include "sf_notifier.h"
+#endif //SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
+
+//=====CFsPool=============================
+
+template <class T>
+CFsPool<T>* CFsPool<T>::New(TInt aPoolSize)
+ {
+ CFsPool<T>* pool = new CFsPool<T>();
+ if(!pool)
+ return NULL;
+
+ TInt r = pool->Construct(aPoolSize);
+ if(r!=KErrNone)
+ {
+ delete pool;
+ return NULL;
+ }
+ else
+ return pool;
+ }
+
+
+template <class T>
+CFsPool<T>::CFsPool()
+ {
+ }
+
+template <class T>
+TInt CFsPool<T>::Construct(TInt aPoolSize)
+ {
+ TInt r = iPoolLock.CreateLocal(KNotificationPoolSize);
+ if(r != KErrNone)
+ return r;
+
+ r = iFreeList.Reserve(KNotificationPoolSize);
+ if(r != KErrNone)
+ return r;
+
+ TInt i = 0;
+ while(i < aPoolSize)
+ {
+ T* t = T::New();
+ if(!t)
+ {
+ return KErrNoMemory;
+ }
+ iFreeList.Append(t);
+ i++;
+ }
+
+ return KErrNone;
+ }
+
+//This should only be called by the Manager when it holds
+//the manager's write lock meaning that all of the
+//blocks should be unallocated
+template <class T>
+CFsPool<T>::~CFsPool()
+ {
+ for(TInt i=0; i < iFreeList.Count(); i++)
+ {
+ delete iFreeList[i];
+ }
+ iFreeList.Close();
+ }
+
+
+template <class T>
+T* CFsPool<T>::Allocate()
+ {
+ Lock(); //Waits when there are no free blocks left
+
+ TInt lastIndex = iFreeList.Count()-1;
+ T* t = iFreeList[lastIndex];
+ iFreeList.Remove(lastIndex);
+
+ return t;
+ }
+
+template <class T>
+void CFsPool<T>::Free(T* aBlock)
+ {
+ iFreeList.Append(aBlock);
+ Unlock();
+ }
+
+template <class T>
+void CFsPool<T>::Lock()
+ {
+ iPoolLock.Wait();
+ }
+
+template <class T>
+void CFsPool<T>::Unlock()
+ {
+ iPoolLock.Signal();
+ }
+
+#ifdef SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
+//This is needed here because the compiler needs to know which types will be
+//instantiating the template (because it's in a separate file)
+template class CFsPool<CFsNotificationBlock>;
+#endif //SYMBIAN_F32_ENHANCED_CHANGE_NOTIFICATION
+