arraypooltest.cpp
来自「MySQL数据库开发源码 值得一看哦」· C++ 代码 · 共 299 行
CPP
299 行
/* Copyright (C) 2003 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include <ndb_global.h>#include <ArrayList.hpp>#include <NdbOut.hpp>#include <NdbTick.h>struct A_Poolable_Object { Uint32 next; char somedata[12]; void print (NdbOut & out) { out << "A_Poolable_Object: next = " << next << endl; }};NdbOut &operator<<(NdbOut & o, A_Poolable_Object & a){ a.print(o); return o;}typedef Ptr<A_Poolable_Object> A_Poolable_ObjectPtr;#if 1#define BPool ArrayPool<A_Poolable_Object>#else#define BPool ArrayPool(A_Poolable_Object, next)#endifclass ArrayPoolTest {public: static void tryPool1(int poolSize, int iterations){ BPool aPool; if(!aPool.setSize(poolSize)){ ndbout << "Failed to do aPool.setSize(" << poolSize << ")" << endl; return; } ndbout << "Seizing/Releaseing " << iterations << " times over pool with " << poolSize << " elements" << endl; int * anArray = new int[poolSize]; int arrayElements = 0; int noOfSeize = 0; int noFailSeize = 0; int noOfRelease = 0; for(int i = 0; i<iterations; i++){ if(!((arrayElements <= poolSize) && (aPool.noOfFree() == aPool.noOfFree2()) && (aPool.noOfFree() == (poolSize - arrayElements)))){ ndbout << "Assertion!!" << " iteration=" << i << endl; const int f1 = aPool.noOfFree(); const int f2 = aPool.noOfFree2(); ndbout << "noOfFree() = " << f1 << endl; ndbout << "noOfFree2() = " << f2 << endl; ndbout << "poolSize = " << poolSize << endl; ndbout << "arrayElemts = " << arrayElements << endl; aPool.print(ndbout); assert(0); } const int r = rand() % (10 * poolSize); if(r < (arrayElements - 1)){ /** * Release an element */ noOfRelease++; aPool.release(anArray[r]); arrayElements--; for(int j = r; j<arrayElements; j++) anArray[j] = anArray[j+1]; } else { /** * Seize an element */ A_Poolable_ObjectPtr p; const int ret = aPool.seize(p); if(ret == RNIL && arrayElements != poolSize){ ndbout << "Failed to seize!!" << " iteration=" << i << endl; ndbout << "Have seized " << arrayElements << " out of " << poolSize << endl; ndbout << "Terminating..." << endl; abort(); } if(arrayElements >= poolSize && ret != RNIL){ ndbout << "Seize did not fail when it should have" << " iteration=" << i << endl; ndbout << "Have seized " << arrayElements << " out of " << poolSize << endl; ndbout << "Terminating..." << endl; abort(); } if(ret != RNIL){ noOfSeize++; anArray[arrayElements] = ret; arrayElements++; memset(p.p, i, sizeof(p.p->somedata)); } else { noFailSeize++; } } } delete []anArray; ndbout << "Seized: " << noOfSeize << " Seized with buffer full: " << noFailSeize << " Release: " << noOfRelease << " --- "; ndbout << "(" << noOfSeize << " + " << noFailSeize << " + " << noOfRelease << " = " << (noOfSeize + noFailSeize + noOfRelease) << ")" << endl; } static void tryPool2(int size, int iter, int fail){ BPool aPool; if(!aPool.setSize(size)){ ndbout << "Failed to do aPool.setSize(" << size << ")" << endl; return; } ndbout << "doing getPtr(i) where i > size(" << size << ") " << fail << " times mixed with " << iter << " ordinary seize/release" << endl; int * anArray = new int[size]; int arrayElements = 0; int noOfSeize = 0; int noFailSeize = 0; int noOfRelease = 0; for(int i = 0; i<iter; i++){ if(!((arrayElements <= size) && (aPool.noOfFree() == aPool.noOfFree2()) && (aPool.noOfFree() == (size - arrayElements)))){ ndbout << "Assertion!!" << " iteration=" << i << endl; const int f1 = aPool.noOfFree(); const int f2 = aPool.noOfFree2(); ndbout << "noOfFree() = " << f1 << endl; ndbout << "noOfFree2() = " << f2 << endl; ndbout << "poolSize = " << size << endl; ndbout << "arrayElemts = " << arrayElements << endl; aPool.print(ndbout); assert(0); } const int r = rand() % (10 * size); if((i + 1)%(iter/fail) == 0){ aPool.getPtr(size + r); continue; } if(r < (arrayElements - 1)){ /** * Release an element */ noOfRelease++; aPool.release(anArray[r]); arrayElements--; for(int j = r; j<arrayElements; j++) anArray[j] = anArray[j+1]; } else { /** * Seize an element */ A_Poolable_ObjectPtr p; const int ret = aPool.seize(p); if(ret == RNIL && arrayElements != size){ ndbout << "Failed to seize!!" << " iteration=" << i << endl; ndbout << "Have seized " << arrayElements << " out of " << size << endl; ndbout << "Terminating..." << endl; abort(); } if(arrayElements >= size && ret != RNIL){ ndbout << "Seize did not fail when it should have" << " iteration=" << i << endl; ndbout << "Have seized " << arrayElements << " out of " << size << endl; ndbout << "Terminating..." << endl; abort(); } if(ret != RNIL){ noOfSeize++; anArray[arrayElements] = ret; arrayElements++; memset(p.p, p.i, sizeof(p.p->somedata)); } else { noFailSeize++; } } } delete []anArray; } static void tryPool3(int size, int fail){ ndbout << "Failing " << fail << " times " << endl; for(int i = 0; i<fail; i++){ BPool aPool; if(!aPool.setSize(size)){ ndbout << "Failed to do aPool.setSize(" << size << ")" << endl; return; } const int noOfElementsInBufferWhenFail = (i + 1) * (size /(fail + 1)); int * anArray = new int[size]; for(int i = 0; i<size; i++) anArray[i] = i; int arrayElements = 0; int noOfSeize = 0; int noFailSeize = 0; int noOfRelease = 0; while(true){ assert(arrayElements <= size); if(arrayElements == noOfElementsInBufferWhenFail){ ndbout << "++ You should get a ErrorReporter::handle... " << endl; aPool.release(anArray[arrayElements]); ndbout << "++ Inbetween these lines" << endl << endl; break; } const int r = rand() % (10 * size); if(r < (arrayElements - 1)){ /** * Release an element */ noOfRelease++; aPool.release(anArray[r]); arrayElements--; for(int j = r; j<arrayElements; j++) anArray[j] = anArray[j+1]; } else { /** * Seize an element */ A_Poolable_ObjectPtr p; const int ret = aPool.seize(p); if(ret == RNIL && arrayElements != size){ ndbout << "Failed to seize!!" << endl; ndbout << "Have seized " << arrayElements << " out of " << size << endl; ndbout << "Terminating..." << endl; abort(); } if(arrayElements >= size && ret != RNIL){ ndbout << "Seize did not fail when it should have" << endl; ndbout << "Have seized " << arrayElements << " out of " << size << endl; ndbout << "Terminating..." << endl; abort(); } if(ret != RNIL){ noOfSeize++; anArray[arrayElements] = ret; arrayElements++; } else { noFailSeize++; } } } delete []anArray; } }};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?