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 + -
显示快捷键?