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

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 <NdbTick.h>
  15. #include <DataBuffer.hpp>
  16. #undef test
  17. struct Buffer {
  18.   Buffer(Uint32 size){ m_sz = size; buffer = new Uint32[m_sz]; m_len = 0;}
  19.   ~Buffer(){ delete [] buffer;}
  20.   
  21.   Uint32 m_sz;
  22.   Uint32 m_len;
  23.   Uint32 * buffer;
  24. };
  25. inline
  26. void 
  27. require(bool b){
  28.   if(!b)
  29.     abort();
  30. }
  31. template<Uint32 sz>
  32. void
  33. compare(DataBuffer<sz> & db, Buffer & buf){
  34.   typename DataBuffer<sz>::DataBufferIterator it; 
  35.   db.first(it);
  36.   for(Uint32 i = 0; i<buf.m_len; i++){
  37.     if(buf.buffer[i] != * it.data){
  38.       db.print(stdout);
  39.       abort();
  40.     }
  41.     db.next(it);
  42.   }
  43.   
  44.   for(Uint32 i = 0; i<buf.m_len; i++){
  45.     if(!db.position(it, i))
  46.       abort();
  47.     if(buf.buffer[i] != * it.data){
  48.       db.print(stdout);
  49.       abort();
  50.     }
  51.   }
  52. }
  53. template<Uint32 sz>
  54. void
  55. test(Uint32 loops, Uint32 iter){
  56.   ndbout_c("DataBuffer<%d> loops=%d iter=%d", sz, loops, iter);
  57.     
  58.   while(loops-- > 0){
  59.     Uint32 size = sz*((10 + (rand() % (10 * sz)) + sz - 1)/sz);
  60.     
  61.     typename DataBuffer<sz>::DataBufferPool thePool;
  62.     typename DataBuffer<sz>::DataBufferIterator it;
  63.     DataBuffer<sz> db(thePool);
  64.     
  65.     thePool.setSize((size + sz - 1) / sz);
  66.     Buffer buf(size);
  67.     
  68.     bool testOverRun = true;
  69.     for(Uint32 i = 0; i<iter; i++){
  70.       Uint32 c = (rand() % (testOverRun ? 7 : 4));
  71.       Uint32 free = (size - db.getSize());
  72.       Uint32 alloc = 0;
  73.       if(free == 0){
  74. c = (testOverRun ? c : 0);
  75. if(c >= 1 && c <= 3)
  76.   c += 3;
  77.       }
  78.       
  79.       if(free <= 1)
  80. alloc = 1;
  81.       else
  82. alloc = 1 + (rand() % (free - 1));
  83.       //ndbout_c("iter=%d case=%d free=%d alloc=%d", i, c, free, alloc);
  84.       switch(c){ 
  85.       case 0: // Release
  86. db.first(it);
  87. for(; !it.curr.isNull(); db.next(it))
  88.   * it.data = 0;
  89. db.release();
  90. buf.m_len = 0;
  91. break;
  92.       case 1:{ // Append (success)
  93. for(Uint32 i = 0; i<alloc; i++)
  94.   buf.buffer[buf.m_len + i] = buf.m_len + i;//rand();
  95. require(db.append(&buf.buffer[buf.m_len], alloc));
  96. buf.m_len += alloc;
  97. break;
  98.       }
  99.       case 2: { // Seize(1) (success)
  100. for(Uint32 i = 0; i<alloc; i++){
  101.   buf.buffer[buf.m_len + i] = buf.m_len + i;//rand();
  102.   require(db.seize(1));
  103.   require(db.position(it, db.getSize()-1));
  104.   * it.data = buf.buffer[buf.m_len + i];
  105. }
  106. buf.m_len += alloc;
  107. break;
  108.       }
  109.       case 3: { // Seize(n) (success)
  110. for(Uint32 i = 0; i<alloc; i++){
  111.   buf.buffer[buf.m_len + i] = buf.m_len + i;//rand();
  112. }
  113. Uint32 pos = db.getSize();
  114. require(db.seize(alloc));
  115. require(db.position(it, pos));
  116. for(Uint32 i = 0; i<alloc; i++){
  117.   * it.data = buf.buffer[buf.m_len + i];
  118.   db.next(it);
  119. }
  120. buf.m_len += alloc;
  121. break;
  122.       }
  123.       case 4: { // Append fail
  124. require(!db.append(buf.buffer, alloc + free));
  125. require(db.getSize() == 0);
  126. buf.m_len = 0;
  127. break;
  128.       }
  129.       case 5: { // Seize(1) - fail
  130. for(Uint32 i = 0; i<free; i++){
  131.   require(db.seize(1));
  132. }
  133. require(!db.seize(1));
  134. require(db.getSize() == 0);
  135. buf.m_len = 0;
  136. break;
  137.       }
  138.       case 6: { // Seize(n) - fail
  139. require(!db.seize(alloc + free));
  140. require(db.getSize() == 0);
  141. buf.m_len = 0;
  142. break;
  143.       }
  144.       }
  145.       compare(db, buf);
  146.     }
  147.   }
  148. }
  149. int
  150. main(void){
  151.   
  152.   srand(NdbTick_CurrentMillisecond());
  153.   
  154.   test<1>(1000, 1000);
  155.   test<11>(1000, 1000);
  156.   test<15>(1000, 1000);
  157.   test<16>(1000, 1000);
  158.   test<17>(1000, 1000);
  159. #if 0
  160. #endif
  161.   return 0;
  162. }
  163. void
  164. ErrorReporter::handleAssert(const char * msg, const char * file, int line)
  165. {
  166.   ndbout << "ErrorReporter::handleAssert activated - " 
  167.  << " line= " << line << endl;
  168.   abort();
  169. }