arrayPoolTest.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.h>
  14. #include <ArrayList.hpp>
  15. #include <NdbOut.hpp>
  16. #include <NdbTick.h>
  17. struct A_Poolable_Object {
  18.   Uint32 next;
  19.   char somedata[12];
  20.   void print (NdbOut & out) {
  21.     out << "A_Poolable_Object: next = " << next << endl;
  22.   }
  23. };
  24. NdbOut &
  25. operator<<(NdbOut & o, A_Poolable_Object & a){
  26.   a.print(o);
  27.   return o;
  28. }
  29. typedef Ptr<A_Poolable_Object> A_Poolable_ObjectPtr;
  30. #if 1
  31. #define BPool ArrayPool<A_Poolable_Object>
  32. #else
  33. #define BPool ArrayPool(A_Poolable_Object, next)
  34. #endif
  35. class ArrayPoolTest {
  36. public:
  37.   static void tryPool1(int poolSize, int iterations){
  38.     BPool aPool;
  39.     
  40.     if(!aPool.setSize(poolSize)){
  41.       ndbout << "Failed to do aPool.setSize(" << poolSize << ")" << endl;
  42.       return;
  43.     }
  44.     
  45.     ndbout << "Seizing/Releaseing " << iterations 
  46.    << " times over pool with " << poolSize << " elements" << endl;
  47.     
  48.     int * anArray = new int[poolSize];
  49.     int arrayElements = 0;
  50.     
  51.     int noOfSeize = 0;
  52.     int noFailSeize = 0;
  53.     int noOfRelease = 0;
  54.     
  55.     for(int i = 0; i<iterations; i++){
  56.       if(!((arrayElements    <= poolSize) &&
  57.    (aPool.noOfFree() == aPool.noOfFree2()) &&
  58.    (aPool.noOfFree() == (poolSize - arrayElements)))){
  59. ndbout << "Assertion!!" 
  60.        << " iteration=" << i << endl;
  61. const int f1 = aPool.noOfFree();
  62. const int f2 = aPool.noOfFree2();
  63. ndbout << "noOfFree()  = " << f1 << endl;
  64. ndbout << "noOfFree2() = " << f2 << endl;
  65. ndbout << "poolSize    = " << poolSize << endl;
  66. ndbout << "arrayElemts = " << arrayElements << endl;
  67. aPool.print(ndbout);
  68. assert(0);
  69.       }
  70.       const int r = rand() % (10 * poolSize);
  71.       if(r < (arrayElements - 1)){
  72. /**
  73.  * Release an element
  74.  */
  75. noOfRelease++;
  76. aPool.release(anArray[r]);
  77. arrayElements--;
  78. for(int j = r; j<arrayElements; j++)
  79.   anArray[j] = anArray[j+1];
  80.       } else {
  81. /**
  82.  * Seize an element
  83.  */
  84. A_Poolable_ObjectPtr p;
  85. const int ret = aPool.seize(p);
  86. if(ret == RNIL && arrayElements != poolSize){
  87.   ndbout << "Failed to seize!!" 
  88.  << " iteration=" << i << endl;
  89.   ndbout << "Have seized " << arrayElements 
  90.  << " out of " << poolSize << endl;
  91.   ndbout << "Terminating..." << endl;
  92.   abort();
  93. }
  94. if(arrayElements >= poolSize && ret != RNIL){
  95.   ndbout << "Seize did not fail when it should have"
  96.  << " iteration=" << i << endl;
  97.   ndbout << "Have seized " << arrayElements 
  98.  << " out of " << poolSize << endl;
  99.   ndbout << "Terminating..." << endl;
  100.   abort();
  101. }
  102. if(ret != RNIL){
  103.   noOfSeize++;
  104.   anArray[arrayElements] = ret;
  105.   arrayElements++;
  106.   memset(p.p, i, sizeof(p.p->somedata));
  107. } else {
  108.   noFailSeize++;
  109. }
  110.       }
  111.     }
  112.     delete []anArray;
  113.   
  114.     ndbout << "Seized: " << noOfSeize 
  115.    << " Seized with buffer full: " << noFailSeize 
  116.    << " Release: " << noOfRelease << " --- ";
  117.     ndbout << "(" << noOfSeize << " + " << noFailSeize << " + " << noOfRelease 
  118.    << " = " << (noOfSeize + noFailSeize + noOfRelease) << ")" << endl;
  119.   }
  120.   static void tryPool2(int size, int iter, int fail){
  121.     BPool aPool;
  122.   
  123.     if(!aPool.setSize(size)){
  124.       ndbout << "Failed to do aPool.setSize(" << size << ")" << endl;
  125.       return;
  126.     }
  127.   
  128.     ndbout << "doing getPtr(i) where i > size(" << size << ") " 
  129.    << fail << " times mixed with " << iter 
  130.    << " ordinary seize/release" << endl;
  131.     int * anArray = new int[size];
  132.     int arrayElements = 0;
  133.   
  134.     int noOfSeize = 0;
  135.     int noFailSeize = 0;
  136.     int noOfRelease = 0;
  137.     for(int i = 0; i<iter; i++){
  138.       if(!((arrayElements    <= size) &&
  139.    (aPool.noOfFree() == aPool.noOfFree2()) &&
  140.    (aPool.noOfFree() == (size - arrayElements)))){
  141. ndbout << "Assertion!!" 
  142.        << " iteration=" << i << endl;
  143. const int f1 = aPool.noOfFree();
  144. const int f2 = aPool.noOfFree2();
  145. ndbout << "noOfFree()  = " << f1 << endl;
  146. ndbout << "noOfFree2() = " << f2 << endl;
  147. ndbout << "poolSize    = " << size << endl;
  148. ndbout << "arrayElemts = " << arrayElements << endl;
  149. aPool.print(ndbout);
  150. assert(0);
  151.       }
  152.       const int r = rand() % (10 * size);
  153.       if((i + 1)%(iter/fail) == 0){
  154. aPool.getPtr(size + r);
  155. continue;
  156.       }
  157.     
  158.       if(r < (arrayElements - 1)){
  159. /**
  160.  * Release an element
  161.  */
  162. noOfRelease++;
  163. aPool.release(anArray[r]);
  164. arrayElements--;
  165. for(int j = r; j<arrayElements; j++)
  166.   anArray[j] = anArray[j+1];
  167.       } else {
  168. /**
  169.  * Seize an element
  170.  */
  171. A_Poolable_ObjectPtr p;
  172. const int ret = aPool.seize(p);
  173. if(ret == RNIL && arrayElements != size){
  174.   ndbout << "Failed to seize!!" 
  175.  << " iteration=" << i << endl;
  176.   ndbout << "Have seized " << arrayElements 
  177.  << " out of " << size << endl;
  178.   ndbout << "Terminating..." << endl;
  179.   abort();
  180. }
  181. if(arrayElements >= size && ret != RNIL){
  182.   ndbout << "Seize did not fail when it should have"
  183.  << " iteration=" << i << endl;
  184.   ndbout << "Have seized " << arrayElements 
  185.  << " out of " << size << endl;
  186.   ndbout << "Terminating..." << endl;
  187.   abort();
  188. }
  189. if(ret != RNIL){
  190.   noOfSeize++;
  191.   anArray[arrayElements] = ret;
  192.   arrayElements++;
  193.   memset(p.p, p.i, sizeof(p.p->somedata));
  194. } else {
  195.   noFailSeize++;
  196. }
  197.       }
  198.     }
  199.     delete []anArray;
  200.   }
  201.   static void
  202.   tryPool3(int size, int fail){
  203.     ndbout << "Failing " << fail << " times " << endl;
  204.     for(int i = 0; i<fail; i++){
  205.       BPool aPool;
  206.       if(!aPool.setSize(size)){
  207. ndbout << "Failed to do aPool.setSize(" << size << ")" << endl;
  208. return;
  209.       }
  210.       const int noOfElementsInBufferWhenFail = (i + 1) * (size /(fail + 1));
  211.       int * anArray = new int[size];
  212.       for(int i = 0; i<size; i++)
  213. anArray[i] = i;
  214.       int arrayElements = 0;
  215.     
  216.       int noOfSeize = 0;
  217.       int noFailSeize = 0;
  218.       int noOfRelease = 0;
  219.     
  220.       while(true){
  221. assert(arrayElements <= size);
  222. if(arrayElements == noOfElementsInBufferWhenFail){
  223.   ndbout << "++ You should get a ErrorReporter::handle... " << endl;
  224.   aPool.release(anArray[arrayElements]);
  225.   ndbout << "++ Inbetween these lines" << endl << endl;
  226.   break;
  227. }
  228. const int r = rand() % (10 * size);
  229. if(r < (arrayElements - 1)){
  230.   /**
  231.    * Release an element
  232.    */
  233.   noOfRelease++;
  234.   aPool.release(anArray[r]);
  235.   arrayElements--;
  236.   for(int j = r; j<arrayElements; j++)
  237.     anArray[j] = anArray[j+1];
  238. } else {
  239.   /**
  240.    * Seize an element
  241.    */
  242.   A_Poolable_ObjectPtr p;
  243.   const int ret = aPool.seize(p);
  244.   if(ret == RNIL && arrayElements != size){
  245.     ndbout << "Failed to seize!!" << endl;
  246.     ndbout << "Have seized " << arrayElements 
  247.    << " out of " << size << endl;
  248.     ndbout << "Terminating..." << endl;
  249.     abort();
  250.   }
  251.   if(arrayElements >= size && ret != RNIL){
  252.     ndbout << "Seize did not fail when it should have" << endl;
  253.     ndbout << "Have seized " << arrayElements 
  254.    << " out of " << size << endl;
  255.     ndbout << "Terminating..." << endl;
  256.     abort();
  257.   }
  258.   if(ret != RNIL){
  259.     noOfSeize++;
  260.     anArray[arrayElements] = ret;
  261.     arrayElements++;
  262.   } else {
  263.     noFailSeize++;
  264.   }
  265. }
  266.       }
  267.       delete []anArray;
  268.     }
  269.   
  270.   }
  271. };