arrayListTest.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:8k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.hpp>
  14. #include <ArrayList.hpp>
  15. #include <NdbOut.hpp>
  16. #include <NdbTick.h>
  17. struct A_Listable_Object {
  18.   Uint32 next;
  19.   Uint32 prev;
  20.   char somedata[12];
  21.   void print (NdbOut & out) {
  22.     out << "ALO: next = " << next
  23. << " prev = " << prev << endl;
  24.   }
  25. };
  26. extern const int x_AL_Next = offsetof(A_Listable_Object, next);
  27. extern const int x_AL_Prev = offsetof(A_Listable_Object, prev);
  28. NdbOut &
  29. operator<<(NdbOut & o, A_Listable_Object & a){
  30.   a.print(o);
  31.   return o;
  32. }
  33. typedef Ptr<A_Listable_Object> A_Listable_ObjectPtr;
  34. #define APool ArrayPool<A_Listable_Object>
  35. #define AList ArrayList<A_Listable_Object>
  36. APool aGPool;
  37. AList aGList(aGPool);
  38. class ArrayListTest {
  39. public:
  40.   static void tryList0(int listSize){
  41.     APool aPool;
  42.     AList aList(aPool);
  43.     if(!aPool.setSize(listSize)){
  44.       ndbout << "Failed to do aPool.setSize(" << listSize << ")" << endl;
  45.       return;
  46.     }
  47.     
  48.     int * anArray = new int[listSize];
  49.     
  50.     for(int i = 1; i<listSize; i++){
  51.       int arrayElements = 0;
  52.       
  53.       for(int j = 0; j<i; j++){
  54. A_Listable_ObjectPtr p;
  55. const int ret = aList.seize(p);
  56. if(ret == RNIL){
  57.   ndbout << "Failed to seize!!"  << endl;
  58.   ndbout << "Have seized " << j
  59.  << " out of " << listSize << endl;
  60.   ndbout << "Terminating..." << endl;
  61.   abort();
  62. }
  63. anArray[arrayElements] = ret;
  64. arrayElements++;
  65.       }
  66.       assert(aList.noOfElements() == i);
  67.       assert(aPool.noOfFree() == (listSize - i));
  68.       assert(arrayElements == i);
  69.       for(int j = 0; j<i; j++){
  70. aList.release(anArray[j]);
  71.       }
  72.       
  73.       assert(aList.noOfElements() == 0);
  74.       assert(aPool.noOfFree() == listSize);
  75.     }
  76.   }
  77.   static void tryList1(int listSize, int iterations){
  78.     APool aPool;
  79.     AList aList(aPool);
  80.     
  81.     if(!aPool.setSize(listSize)){
  82.       ndbout << "Failed to do aPool.setSize(" << listSize << ")" << endl;
  83.       return;
  84.     }
  85.     
  86.     ndbout << "Seizing/Releaseing " << iterations 
  87.    << " times over list with " << listSize << " elements" << endl;
  88.     
  89.     int * anArray = new int[listSize];
  90.     int arrayElements = 0;
  91.     
  92.     int noOfSeize = 0;
  93.     int noFailSeize = 0;
  94.     int noOfRelease = 0;
  95.     
  96.     for(int i = 0; i<iterations; i++){
  97.       assert(arrayElements <= listSize);
  98.       const int r = rand() % (10 * listSize);
  99.       if(r < (arrayElements - 1)){
  100. /**
  101.  * Release an element
  102.  */
  103. noOfRelease++;
  104. aList.release(anArray[r]);
  105. arrayElements--;
  106. for(int j = r; j<arrayElements; j++)
  107.   anArray[j] = anArray[j+1];
  108.       } else {
  109. /**
  110.  * Seize an element
  111.  */
  112. A_Listable_ObjectPtr p;
  113. const int ret = aList.seize(p);
  114. if(ret == RNIL && arrayElements != listSize){
  115.   ndbout << "Failed to seize!!" 
  116.  << " iteration=" << i << endl;
  117.   ndbout << "Have seized " << arrayElements 
  118.  << " out of " << listSize << endl;
  119.   ndbout << "Terminating..." << endl;
  120.   abort();
  121. }
  122. if(arrayElements >= listSize && ret != RNIL){
  123.   ndbout << "Seize did not fail when it should have"
  124.  << " iteration=" << i << endl;
  125.   ndbout << "Have seized " << arrayElements 
  126.  << " out of " << listSize << endl;
  127.   ndbout << "Terminating..." << endl;
  128.   abort();
  129. }
  130. if(ret != RNIL){
  131.   noOfSeize++;
  132.   anArray[arrayElements] = ret;
  133.   arrayElements++;
  134. } else {
  135.   noFailSeize++;
  136. }
  137.       }
  138.     }
  139.     delete []anArray;
  140.   
  141.     ndbout << "Seized: " << noOfSeize 
  142.    << " Seized with buffer full: " << noFailSeize 
  143.    << " Release: " << noOfRelease << " --- ";
  144.     ndbout << "(" << noOfSeize << " + " << noFailSeize << " + " << noOfRelease 
  145.    << " = " << (noOfSeize + noFailSeize + noOfRelease) << ")" << endl;
  146.   }
  147.   static void tryList2(int size, int iter, int fail){
  148.     APool aPool;
  149.     AList aList(aPool);
  150.   
  151.     if(!aPool.setSize(size)){
  152.       ndbout << "Failed to do aPool.setSize(" << size << ")" << endl;
  153.       return;
  154.     }
  155.   
  156.     ndbout << "doing getPtr(i) where i > size(" << size << ") " 
  157.    << fail << " times mixed with " << iter 
  158.    << " ordinary seize/release" << endl;
  159.     int * anArray = new int[size];
  160.     int arrayElements = 0;
  161.   
  162.     int noOfSeize = 0;
  163.     int noFailSeize = 0;
  164.     int noOfRelease = 0;
  165.     for(int i = 0; i<iter; i++){
  166.       assert(arrayElements <= size);
  167.       const int r = rand() % (10 * size);
  168.       if((i + 1)%(iter/fail) == 0){
  169. aList.getPtr(size + r);
  170. continue;
  171.       }
  172.     
  173.       if(r < (arrayElements - 1)){
  174. /**
  175.  * Release an element
  176.  */
  177. noOfRelease++;
  178. aList.release(anArray[r]);
  179. arrayElements--;
  180. for(int j = r; j<arrayElements; j++)
  181.   anArray[j] = anArray[j+1];
  182.       } else {
  183. /**
  184.  * Seize an element
  185.  */
  186. A_Listable_ObjectPtr p;
  187. const int ret = aList.seize(p);
  188. if(ret == RNIL && arrayElements != size){
  189.   ndbout << "Failed to seize!!" 
  190.  << " iteration=" << i << endl;
  191.   ndbout << "Have seized " << arrayElements 
  192.  << " out of " << size << endl;
  193.   ndbout << "Terminating..." << endl;
  194.   abort();
  195. }
  196. if(arrayElements >= size && ret != RNIL){
  197.   ndbout << "Seize did not fail when it should have"
  198.  << " iteration=" << i << endl;
  199.   ndbout << "Have seized " << arrayElements 
  200.  << " out of " << size << endl;
  201.   ndbout << "Terminating..." << endl;
  202.   abort();
  203. }
  204. if(ret != RNIL){
  205.   noOfSeize++;
  206.   anArray[arrayElements] = ret;
  207.   arrayElements++;
  208. } else {
  209.   noFailSeize++;
  210. }
  211.       }
  212.     }
  213.     delete []anArray;
  214.   }
  215.   static void
  216.   tryList3(int size, int fail){
  217.     ndbout << "Failing " << fail << " times " << endl;
  218.     for(int i = 0; i<fail; i++){
  219.       APool aPool;
  220.       AList aList(aPool);
  221.     
  222.       if(!aPool.setSize(size)){
  223. ndbout << "Failed to do aPool.setSize(" << size << ")" << endl;
  224. return;
  225.       }
  226.       const int noOfElementsInBufferWhenFail = (i + 1) * (size /(fail + 1));
  227.       int * anArray = new int[size];
  228.       for(int i = 0; i<size; i++)
  229. anArray[i] = i;
  230.       int arrayElements = 0;
  231.     
  232.       int noOfSeize = 0;
  233.       int noFailSeize = 0;
  234.       int noOfRelease = 0;
  235.     
  236.       while(true){
  237. assert(arrayElements <= size);
  238. if(arrayElements == noOfElementsInBufferWhenFail){
  239.   ndbout << "++ You should get a ErrorReporter::handle... " << endl;
  240.   aList.release(anArray[arrayElements]);
  241.   ndbout << "++ Inbetween these lines" << endl << endl;
  242.   break;
  243. }
  244. const int r = rand() % (10 * size);
  245. if(r < (arrayElements - 1)){
  246.   /**
  247.    * Release an element
  248.    */
  249.   noOfRelease++;
  250.   aList.release(anArray[r]);
  251.   arrayElements--;
  252.   for(int j = r; j<arrayElements; j++)
  253.     anArray[j] = anArray[j+1];
  254. } else {
  255.   /**
  256.    * Seize an element
  257.    */
  258.   A_Listable_ObjectPtr p;
  259.   const int ret = aList.seize(p);
  260.   if(ret == RNIL && arrayElements != size){
  261.     ndbout << "Failed to seize!!" << endl;
  262.     ndbout << "Have seized " << arrayElements 
  263.    << " out of " << size << endl;
  264.     ndbout << "Terminating..." << endl;
  265.     abort();
  266.   }
  267.   if(arrayElements >= size && ret != RNIL){
  268.     ndbout << "Seize did not fail when it should have" << endl;
  269.     ndbout << "Have seized " << arrayElements 
  270.    << " out of " << size << endl;
  271.     ndbout << "Terminating..." << endl;
  272.     abort();
  273.   }
  274.   if(ret != RNIL){
  275.     noOfSeize++;
  276.     anArray[arrayElements] = ret;
  277.     arrayElements++;
  278.   } else {
  279.     noFailSeize++;
  280.   }
  281. }
  282.       }
  283.       delete []anArray;
  284.     }
  285.   
  286.   }
  287. };