kerneltest/e32test/heap/t_heapdl.cpp
branchRCL_3
changeset 257 3e88ff8f41d5
parent 256 c1f20ce4abcf
child 258 880ff05ad710
child 263 9e2d4f7f5028
--- a/kerneltest/e32test/heap/t_heapdl.cpp	Tue Aug 31 16:34:26 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,509 +0,0 @@
-// Copyright (c) 1995-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:
-// e32test\heap\t_heapdl.cpp
-// Overview:
-// Tests RHybridHeap class.
-// API Information:
-// RHybridHeap
-// Details:
-// 
-//
-
-#include <e32test.h>
-#include <e32math.h>
-#include <e32def_private.h>
-#include "dla.h"
-#include "slab.h"
-#include "page_alloc.h"
-#include "heap_hybrid.h"
-
-const TUint KTestIterations = 100;
-
-const TInt KHeadSize = (TInt)RHeap::EAllocCellSize;
-
-class TestHybridHeap
-  {
-public:
-  static void TopSize(TInt& aTopSize, const RHybridHeap * aHybridHeap);
-  static void DvSize(TInt& aDvSize, const RHybridHeap * aHybridHeap);
-  static void SmallMap(TUint& aSmallMap, const RHybridHeap * aHybridHeap);
-  static void TreeMap(TUint& aTreeMap, const RHybridHeap * aHybridHeap);
-  static void TrimCheck(TInt& aTrimCheck, const RHybridHeap * aHybridHeap);
-  static void GrowBy(TInt& aGrowBy, const RHybridHeap * aHybridHeap);
-  static void PageSize(TInt& aPageSize, const RHybridHeap * aHybridHeap);
-  };
-
-
-void TestHybridHeap::TopSize(TInt& aTopSize, const RHybridHeap * aHybridHeap)
-  {
-  aTopSize = aHybridHeap->iGlobalMallocState.iTopSize;
-  }
-
-
-void TestHybridHeap::DvSize(TInt& aDvSize, const RHybridHeap * aHybridHeap)
-  {
-  aDvSize = aHybridHeap->iGlobalMallocState.iDvSize;
-  }
-
-
-void TestHybridHeap::SmallMap(TUint& aSmallMap, const RHybridHeap * aHybridHeap)
-  {
-  aSmallMap = aHybridHeap->iGlobalMallocState.iSmallMap;
-  }
-
-
-void TestHybridHeap::TreeMap(TUint& aTreeMap, const RHybridHeap * aHybridHeap)
-  {
-  aTreeMap = aHybridHeap->iGlobalMallocState.iTreeMap;
-  }
-
-
-void TestHybridHeap::TrimCheck(TInt& aTrimCheck, const RHybridHeap * aHybridHeap)
-  {
-  aTrimCheck = aHybridHeap->iGlobalMallocState.iTrimCheck;
-  }
-
-
-void TestHybridHeap::GrowBy(TInt& aGrowBy, const RHybridHeap * aHybridHeap)
-  {
-  aGrowBy = aHybridHeap->iGrowBy;
-  }
-
-void TestHybridHeap::PageSize(TInt& aPageSize, const RHybridHeap * aHybridHeap)
-  {
-  aPageSize = aHybridHeap->iPageSize;
-  }
-
-
-LOCAL_D RTest test(_L("T_HEAPDL"));
-
-
-class TestRHeap
-  {
-public:
-  void InitTests();
-  void Test1(void);
-  void Test2(void);
-  void Test3(void);
-  void Test4(void);
-  void CloseTests();
-private:
-  RHybridHeap* iHybridHeap;
-  RHeap *iHeap;
-  };
-
-
-void TestRHeap::InitTests()
-  {
-  // Allocate a chunk heap
-  TPtrC testHeap=_L("TESTHEAP");
-  iHeap=User::ChunkHeap(&testHeap,0x1800,0x16000);
-        
-  RHybridHeap::STestCommand cmd;
-  cmd.iCommand = RHybridHeap::EHeapMetaData;
-  iHeap->DebugFunction(RHeap::EHybridHeap, (TAny*)&cmd );
-  iHybridHeap = (RHybridHeap*) cmd.iData;
-  }
-
-
-void TestRHeap::Test1(void)
-  {
-  //
-  //  Splitting a new cell off 'top' chunk
-  //  Growing and shrinking 'top' chunk
-  //  Coalesceing of adjacent free cells
-  //
-    
-  TInt topSizeBefore, topSizeAfter, allocSize;
-  TInt growBy, pageSize;
-  TestHybridHeap::GrowBy(growBy,iHybridHeap);
-  TestHybridHeap::PageSize(pageSize,iHybridHeap);
-        
-  //Splitting a new cell off 'top' chunk
-  TestHybridHeap::TopSize(topSizeBefore,iHybridHeap);
-  TAny* p1=iHeap->Alloc(0x256);
-  TestHybridHeap::TopSize(topSizeAfter,iHybridHeap);
-  test(topSizeBefore > topSizeAfter);
-  iHeap->Check();
-  iHeap->Free(p1);
-  iHeap->Check();
-    
-  //Growing 'top' chunk
-  test(iHeap!=NULL);
-  TestHybridHeap::TopSize(topSizeBefore,iHybridHeap);
-  p1=iHeap->Alloc(pageSize*2); 
-  test(p1!=NULL);
-  allocSize=iHeap->AllocLen(p1);
-  TestHybridHeap::TopSize(topSizeAfter,iHybridHeap);
-  test(topSizeBefore + growBy == topSizeAfter+allocSize+KHeadSize);
-    
-  //Splitting a new cell off 'top' chunk
-  TAny *p2=iHeap->Alloc(pageSize/8); 
-  test(p2!=NULL);
-  //Splitting a new cell off 'top' chunk
-  TAny *p3=iHeap->Alloc(pageSize/2); 
-  test(p3!=NULL);
-  //Growing 'top' chunk
-  TAny *p4=iHeap->Alloc(pageSize*2); 
-  test(p4!=NULL);
-  //Take allocSize of p4
-  allocSize=iHeap->AllocLen(p4);
-    
-  //Shrinking 'top' chunk
-  TInt trimCheck;
-  TestHybridHeap::TopSize(topSizeBefore,iHybridHeap);
-  iHeap->Free(p4);
-  TestHybridHeap::TopSize(topSizeAfter,iHybridHeap);
-  TestHybridHeap::TrimCheck(trimCheck,iHybridHeap);
-  test(topSizeAfter + trimCheck == topSizeBefore+allocSize+KHeadSize);
-  iHeap->Check();
-  
-  //Insert chunk into treebin
-  TUint treeMap,treeMap2;
-  TestHybridHeap::TreeMap(treeMap,iHybridHeap);
-  test(treeMap==0);
-  iHeap->Free(p2);
-  TestHybridHeap::TreeMap(treeMap,iHybridHeap);
-  test(treeMap>0);
-  iHeap->Check();
-    
-  //Coalesce adjacent free cells and insert chunk into treebin
-  TestHybridHeap::TreeMap(treeMap,iHybridHeap);
-  iHeap->Free(p1);
-  TestHybridHeap::TreeMap(treeMap2,iHybridHeap);
-  test(treeMap < treeMap2);
-  iHeap->Check();
-    
-  //free last allocation
-  iHeap->Free(p3);
-  iHeap->Check();
-  }
-
-
-void TestRHeap::Test2(void)
-  {
-  //
-  // Allocation of exact sized cells from 'small cell' lists (smallbin)
-  // Freeing of exact sized cells back to 'small cell' lists (smallbin)
-  //
-  TInt ArraySize=32;
-  TInt cellSize=0;
-  TInt topSizeBefore, topSizeAfter;
-     
-  TAny** ArrayOfCells;
-  ArrayOfCells= new TAny*[ArraySize];
-  TInt ArrayIndex;
-  // Allocate exact sized small cells 8,16,32,40--->
-  // and put them to the array. They are allocated from TOP chunk
-  for(ArrayIndex=0; ArrayIndex<ArraySize;ArrayIndex++)
-    {
-    TestHybridHeap::TopSize(topSizeBefore,iHybridHeap);
-    cellSize=cellSize+8;
-    ArrayOfCells[ArrayIndex]=iHeap->Alloc(cellSize);
-    TestHybridHeap::TopSize(topSizeAfter,iHybridHeap);
-    test(topSizeBefore > topSizeAfter);
-    }
-  iHeap->Check();
-  
-  TUint smallMap, smallMap2;
-  TInt dvSize, dvSize2;
-  TestHybridHeap::SmallMap(smallMap,iHybridHeap);
-  test(smallMap == 0);
-  // Free some of small cells from the array. So they are inserted
-  // to the smallbin
-  for(ArrayIndex=2; ArrayIndex<ArraySize-1; ArrayIndex+=5)
-    {
-    TestHybridHeap::SmallMap(smallMap,iHybridHeap);
-    iHeap->Free(ArrayOfCells[ArrayIndex]);
-    TestHybridHeap::SmallMap(smallMap2,iHybridHeap);
-    test(smallMap<smallMap2);
-    }
-  iHeap->Check();
-    
-  // Allocate exact sized cells from smallbin (or Designated Victim)   
-  TestHybridHeap::SmallMap(smallMap,iHybridHeap);
-  TAny* p1=iHeap->Alloc(32);
-  TestHybridHeap::SmallMap(smallMap2,iHybridHeap);
-  test(smallMap>smallMap2);
-    
-  TestHybridHeap::SmallMap(smallMap,iHybridHeap);
-  TestHybridHeap::DvSize(dvSize,iHybridHeap);
-  TAny* p2=iHeap->Alloc(32);
-  TestHybridHeap::SmallMap(smallMap2,iHybridHeap);
-  TestHybridHeap::DvSize(dvSize2,iHybridHeap);
-  if(dvSize <= dvSize2)
-    test(smallMap>smallMap2);
-    
-  TestHybridHeap::SmallMap(smallMap,iHybridHeap);
-  TestHybridHeap::DvSize(dvSize,iHybridHeap);
-  TAny* p3=iHeap->Alloc(32);
-  TestHybridHeap::SmallMap(smallMap2,iHybridHeap);
-  TestHybridHeap::DvSize(dvSize2,iHybridHeap);
-  if(dvSize <= dvSize2)
-  	test(smallMap>smallMap2);
-   
-  TestHybridHeap::SmallMap(smallMap,iHybridHeap);
-  TestHybridHeap::DvSize(dvSize,iHybridHeap);
-  TAny* p4=iHeap->Alloc(32);
-  TestHybridHeap::SmallMap(smallMap2,iHybridHeap);
-  TestHybridHeap::DvSize(dvSize2,iHybridHeap);
-  if(dvSize <= dvSize2)
-    test(smallMap>smallMap2);
-   
-  TestHybridHeap::SmallMap(smallMap,iHybridHeap);
-  TestHybridHeap::DvSize(dvSize,iHybridHeap);
-  TAny* p5=iHeap->Alloc(48);
-  TestHybridHeap::SmallMap(smallMap2,iHybridHeap);
-  TestHybridHeap::DvSize(dvSize2,iHybridHeap);
-  if(dvSize <= dvSize2)
-    test(smallMap>smallMap2);
-    
-  TestHybridHeap::SmallMap(smallMap,iHybridHeap);
-  TestHybridHeap::DvSize(dvSize,iHybridHeap);
-  TAny* p6=iHeap->Alloc(64);
-  TestHybridHeap::SmallMap(smallMap2,iHybridHeap);
-  TestHybridHeap::DvSize(dvSize2,iHybridHeap);
-  if(dvSize <= dvSize2)
-    test(smallMap>smallMap2);
-   
-  TestHybridHeap::SmallMap(smallMap,iHybridHeap);
-  TestHybridHeap::DvSize(dvSize,iHybridHeap);
-  TAny* p7=iHeap->Alloc(80);
-  TestHybridHeap::SmallMap(smallMap2,iHybridHeap);
-  TestHybridHeap::DvSize(dvSize2,iHybridHeap);
-  if(dvSize <= dvSize2)
-    test(smallMap>smallMap2);
-   
-  TestHybridHeap::SmallMap(smallMap,iHybridHeap);
-  TestHybridHeap::DvSize(dvSize,iHybridHeap);
-  TAny* p8=iHeap->Alloc(96);
-  TestHybridHeap::SmallMap(smallMap2,iHybridHeap);
-  TestHybridHeap::DvSize(dvSize2,iHybridHeap);
-  if(dvSize <= dvSize2)
-    test(smallMap>smallMap2);
-  iHeap->Check();
-  
-  // Freeing of exact sized cells back to smallbin
-  TestHybridHeap::SmallMap(smallMap,iHybridHeap);
-  iHeap->Free(p1);
-  iHeap->Free(p2);
-  iHeap->Free(p3);
-  iHeap->Free(p4);
-  iHeap->Free(p5);
-  iHeap->Free(p6);
-  iHeap->Free(p7);
-  iHeap->Free(p8);
-  TestHybridHeap::SmallMap(smallMap2,iHybridHeap);
-  test(smallMap < smallMap2);
-  iHeap->Check();
-  
-  // Now free rest of the array with Reset
-  iHeap->Reset();
-  iHeap->Check();
-  
-  delete [] ArrayOfCells;
-  }
-
-
-void TestRHeap::Test3(void)
-  {
-  //
-  // Allocation of approximate sized cells from 'small cell' lists (smallbin)
-  //
-  const TInt ArraySize=32;
-  TInt cellSize=0;
-  TAny** ArrayOfCells;
-  ArrayOfCells= new TAny*[ArraySize];
-  TInt ArrayIndex;
-  TInt topSizeBefore, topSizeAfter;
-    
-  // Allocate small approximate sized cells and put
-  //them to the array. They are allocated from TOP chunk
-  TUint8 randomSize[ArraySize];
-  for(ArrayIndex=0; ArrayIndex<ArraySize;ArrayIndex++)
-    {
-    TestHybridHeap::TopSize(topSizeBefore,iHybridHeap);
-    // Ensure that the size of the cell does not exceed 256 bytes on debug builds
-    randomSize[ArrayIndex] = (TUint8) (Math::Random() % (MAX_SMALL_REQUEST + 1 - RHeap::EDebugHdrSize));
-  	cellSize=randomSize[ArrayIndex];
-  	ArrayOfCells[ArrayIndex]=iHeap->Alloc(cellSize);
-  	TestHybridHeap::TopSize(topSizeAfter,iHybridHeap);
-  	test(topSizeBefore > topSizeAfter);
-  	}
-  iHeap->Check();
-  
-  TUint smallMap, smallMap2;
-  // Free some of allocated cells from the array. So they are inserted
-  // to the smallbin
-  TestHybridHeap::SmallMap(smallMap,iHybridHeap);
-  for(ArrayIndex=2; ArrayIndex<ArraySize-1; ArrayIndex+=5)
-    {
-    iHeap->Free(ArrayOfCells[ArrayIndex]);
-    }
-  TestHybridHeap::SmallMap(smallMap2,iHybridHeap);
-  test(smallMap<=smallMap2);
-  iHeap->Check();
-  
-  // Allocate approximate sized cells from smallbin
-  const TInt ArraySize2=6;
-  TInt cellSize2=0;
-  TAny** ArrayOfCells2;
-  ArrayOfCells2= new TAny*[ArraySize2];
-  TInt ArrayIndex2;
-  TestHybridHeap::SmallMap(smallMap,iHybridHeap);
-  TUint8 randomSize2[ArraySize2];
-  for(ArrayIndex2=0; ArrayIndex2<ArraySize2;ArrayIndex2++)
-    {
-    randomSize2[ArrayIndex2]=randomSize[2+ArrayIndex2*5];
-    cellSize2=randomSize2[ArrayIndex2];
-    ArrayOfCells2[ArrayIndex2]=iHeap->Alloc(cellSize2);
-    }
-  TestHybridHeap::SmallMap(smallMap2,iHybridHeap);
-  test(smallMap>=smallMap2);
-  iHeap->Check();
-  
-  // Freeing of approximate sized cells back to smallbin
-  for(ArrayIndex2=0; ArrayIndex2<ArraySize2-1; ArrayIndex2+=1)
-    {
-    iHeap->Free(ArrayOfCells2[ArrayIndex2]);
-    }
-  iHeap->Check();
-  
-  // Now free rest of the array with Reset
-  iHeap->Reset();
-  iHeap->Check();
-  
-  delete [] ArrayOfCells;
-  delete [] ArrayOfCells2; 
-  }
-
-
-void TestRHeap::Test4(void)
-  {
-  //
-  // Allocation of approximate sized cells from digital trees (treebin) and splitting
-  // Freeing of approximate sized cells back to digital trees (treebin)
-  //
-  const TInt ArraySize=32;
-  TInt cellSize=0;
-  TAny** ArrayOfCells;
-  ArrayOfCells= new TAny*[ArraySize];
-  TInt ArrayIndex;
-        
-  // Allocate approximate sized cells bigger than 256
-  // and put them to the array. They are allocated from TOP chunk
-  TUint8 randomSize[ArraySize];
-  for(ArrayIndex=0; ArrayIndex<ArraySize;ArrayIndex++)
-    {
-    randomSize[ArrayIndex] = (TUint8)Math::Random();
-    cellSize=(randomSize[ArrayIndex]+MAX_SMALL_REQUEST+1);
-    ArrayOfCells[ArrayIndex]=iHeap->Alloc(cellSize);
-    }
-  iHeap->Check();
-  
-  TUint treeMap,treeMap2;
-  // Free some of allocated cells from the array. So they are inserted
-  // to the treebin
-  for(ArrayIndex=2; ArrayIndex<ArraySize-1; ArrayIndex+=5)
-    {
-    TestHybridHeap::TreeMap(treeMap,iHybridHeap);
-    iHeap->Free(ArrayOfCells[ArrayIndex]);
-    TestHybridHeap::TreeMap(treeMap2,iHybridHeap);
-    test(treeMap <= treeMap2);
-    }
-  iHeap->Check();
-  
-  // Allocate approximate sized cells from treebin
-  const TInt ArraySize2=16;
-  TInt cellSize2=0;    
-  TAny** ArrayOfCells2;
-  ArrayOfCells2= new TAny*[ArraySize2];
-  TInt ArrayIndex2;
-  TUint8 randomSize2[ArraySize2];
-  for(ArrayIndex2=0; ArrayIndex2<ArraySize2;ArrayIndex2++)
-    {
-    TestHybridHeap::TreeMap(treeMap,iHybridHeap);
-    randomSize2[ArrayIndex2] = (TUint8)Math::Random();
-    cellSize2=(randomSize2[ArrayIndex2]+MAX_SMALL_REQUEST+1);
-    ArrayOfCells2[ArrayIndex2]=iHeap->Alloc(cellSize2);
-    TestHybridHeap::TreeMap(treeMap2,iHybridHeap);
-    test(treeMap >= treeMap2);
-    }
-  iHeap->Check();
-  
-  // Freeing of approximate sized cells back to treebin
-  TestHybridHeap::TreeMap(treeMap,iHybridHeap);
-  for(ArrayIndex2=0; ArrayIndex2<ArraySize2-1; ArrayIndex2+=1)
-    {
-    iHeap->Free(ArrayOfCells2[ArrayIndex2]);
-    }
-  TestHybridHeap::TreeMap(treeMap2,iHybridHeap);
-  test(treeMap <= treeMap2);
-  iHeap->Check();
-    
-  // Now free rest of the array with Reset
-  iHeap->Reset();
-  iHeap->Check();
-    
-  delete [] ArrayOfCells;
-  delete [] ArrayOfCells2; 
-  }
-
-
-void TestRHeap::CloseTests()
-  {
-  // close heap so we don't exceed chunk limit
-  iHeap->Close();  
-  }
-
-
-GLDEF_C TInt E32Main(void)
-  {
-  test.Title();
-
-  __KHEAP_MARK;
-
-  TestRHeap T;
-  TUint i;
-  test.Start(_L("Init DL allocator tests"));
-  T.InitTests();
-  test.Next(_L("Test DL allocator 1"));
-  for(i = 0; i < KTestIterations; i++)
-    {
-    T.Test1();
-    }
-  test.Next(_L("Test DL allocator 2"));
-  for(i = 0; i < KTestIterations; i++)
-    {
-    T.Test2();
-    }
-  test.Next(_L("Test DL allocator 3"));
-  for(i = 0; i < KTestIterations; i++)
-    {
-    T.Test3();
-    }
-  test.Next(_L("Test DL allocator 4"));
-  for(i = 0; i < KTestIterations; i++)
-    {
-    T.Test4();
-    }
-  test.Next(_L("Close DL allocator tests"));
-  T.CloseTests();
-	
-  __KHEAP_CHECK(0);
-  __KHEAP_MARKEND;
-
-  test.End();
-  return(0);
-  }