testdatabuffer.cpp

来自「MySQL数据库开发源码 值得一看哦」· C++ 代码 · 共 189 行

CPP
189
字号
/* 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 <NdbTick.h>#include <DataBuffer.hpp>#undef teststruct Buffer {  Buffer(Uint32 size){ m_sz = size; buffer = new Uint32[m_sz]; m_len = 0;}  ~Buffer(){ delete [] buffer;}    Uint32 m_sz;  Uint32 m_len;  Uint32 * buffer;};inlinevoid require(bool b){  if(!b)    abort();}template<Uint32 sz>voidcompare(DataBuffer<sz> & db, Buffer & buf){  typename DataBuffer<sz>::DataBufferIterator it;   db.first(it);  for(Uint32 i = 0; i<buf.m_len; i++){    if(buf.buffer[i] != * it.data){      db.print(stdout);      abort();    }    db.next(it);  }    for(Uint32 i = 0; i<buf.m_len; i++){    if(!db.position(it, i))      abort();    if(buf.buffer[i] != * it.data){      db.print(stdout);      abort();    }  }}template<Uint32 sz>voidtest(Uint32 loops, Uint32 iter){  ndbout_c("DataBuffer<%d> loops=%d iter=%d", sz, loops, iter);      while(loops-- > 0){    Uint32 size = sz*((10 + (rand() % (10 * sz)) + sz - 1)/sz);        typename DataBuffer<sz>::DataBufferPool thePool;    typename DataBuffer<sz>::DataBufferIterator it;    DataBuffer<sz> db(thePool);        thePool.setSize((size + sz - 1) / sz);    Buffer buf(size);        bool testOverRun = true;    for(Uint32 i = 0; i<iter; i++){      Uint32 c = (rand() % (testOverRun ? 7 : 4));      Uint32 free = (size - db.getSize());      Uint32 alloc = 0;      if(free == 0){	c = (testOverRun ? c : 0);	if(c >= 1 && c <= 3)	  c += 3;      }            if(free <= 1)	alloc = 1;      else	alloc = 1 + (rand() % (free - 1));      //ndbout_c("iter=%d case=%d free=%d alloc=%d", i, c, free, alloc);      switch(c){       case 0: // Release	db.first(it);	for(; !it.curr.isNull(); db.next(it))	  * it.data = 0;		db.release();	buf.m_len = 0;	break;      case 1:{ // Append (success)	for(Uint32 i = 0; i<alloc; i++)	  buf.buffer[buf.m_len + i] = buf.m_len + i;//rand();		require(db.append(&buf.buffer[buf.m_len], alloc));	buf.m_len += alloc;	break;      }      case 2: { // Seize(1) (success)	for(Uint32 i = 0; i<alloc; i++){	  buf.buffer[buf.m_len + i] = buf.m_len + i;//rand();	  require(db.seize(1));	  require(db.position(it, db.getSize()-1));	  * it.data = buf.buffer[buf.m_len + i];	}	buf.m_len += alloc;	break;      }      case 3: { // Seize(n) (success)	for(Uint32 i = 0; i<alloc; i++){	  buf.buffer[buf.m_len + i] = buf.m_len + i;//rand();	}	Uint32 pos = db.getSize();	require(db.seize(alloc));	require(db.position(it, pos));	for(Uint32 i = 0; i<alloc; i++){	  * it.data = buf.buffer[buf.m_len + i];	  db.next(it);	}	buf.m_len += alloc;	break;      }      case 4: { // Append fail	require(!db.append(buf.buffer, alloc + free));	require(db.getSize() == 0);	buf.m_len = 0;	break;      }      case 5: { // Seize(1) - fail	for(Uint32 i = 0; i<free; i++){	  require(db.seize(1));	}		require(!db.seize(1));	require(db.getSize() == 0);	buf.m_len = 0;	break;      }      case 6: { // Seize(n) - fail	require(!db.seize(alloc + free));	require(db.getSize() == 0);	buf.m_len = 0;	break;      }      }      compare(db, buf);    }  }}intmain(void){    srand(NdbTick_CurrentMillisecond());    test<1>(1000, 1000);  test<11>(1000, 1000);  test<15>(1000, 1000);  test<16>(1000, 1000);  test<17>(1000, 1000);#if 0#endif  return 0;}voidErrorReporter::handleAssert(const char * msg, const char * file, int line){  ndbout << "ErrorReporter::handleAssert activated - " 	 << " line= " << line << endl;  abort();}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?