SafeCounter.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 "SimulatedBlock.hpp"
  14. #include "SafeCounter.hpp"
  15. #include <signaldata/NodeFailRep.hpp>
  16. SafeCounterManager::SafeCounterManager(class SimulatedBlock & block)
  17.   : m_block(block),
  18.     m_activeCounters(m_counterPool)
  19. {}
  20.   
  21. bool
  22. SafeCounterManager::setSize(Uint32 maxNoOfActiveMutexes) {
  23.   return m_counterPool.setSize(maxNoOfActiveMutexes);
  24. }
  25. Uint32
  26. SafeCounterManager::getSize() const {
  27.   return m_counterPool.getSize();
  28. }
  29. bool
  30. SafeCounterManager::seize(ActiveCounterPtr& ptr){
  31.   return m_activeCounters.seize(ptr);
  32. }
  33. void
  34. SafeCounterManager::release(ActiveCounterPtr& ptr){
  35.   m_activeCounters.release(ptr);
  36. }
  37. void
  38. SafeCounterManager::getPtr(ActiveCounterPtr& ptr, Uint32 ptrI){
  39.   m_activeCounters.getPtr(ptr, ptrI);
  40. }
  41. void
  42. SafeCounterManager::printNODE_FAILREP(){
  43.   ActiveCounterPtr ptr;
  44.   NodeBitmask nodes;
  45.   nodes.clear();
  46.   //  nodes.bitORC(nodes);
  47.   for(m_activeCounters.first(ptr); !ptr.isNull(); m_activeCounters.next(ptr)){
  48.     ActiveCounter::SignalDesc desc = ptr.p->m_signalDesc;
  49.     ndbout_c("theData[desc.m_senderDataOffset=%u] = %u",
  50.      desc.m_senderDataOffset, ptr.p->m_senderData);
  51.     ndbout_c("theData[desc.m_errorCodeOffset=%u] = %u",
  52.      desc.m_errorCodeOffset, desc.m_nodeFailErrorCode);
  53.     Uint32 len = MAX(MAX(desc.m_senderDataOffset, desc.m_errorCodeOffset),
  54.      desc.m_senderRefOffset);
  55.     
  56.     NodeBitmask overlapping = ptr.p->m_nodes;
  57.     Uint32 i = 0;
  58.     while((i = overlapping.find(i)) != NodeBitmask::NotFound){
  59.       ndbout_c("  theData[desc.m_senderRefOffset=%u] = %x",
  60.        desc.m_senderRefOffset, numberToRef(desc.m_block, i));
  61.       ndbout_c("  sendSignal(%x,%u,signal,%u,JBB",
  62.        m_block.reference(), desc.m_gsn, len+1);
  63.       i++;
  64.     }
  65.   }
  66. }
  67. void
  68. SafeCounterManager::execNODE_FAILREP(Signal* signal){
  69.   Uint32 * theData = signal->getDataPtrSend();
  70.   ActiveCounterPtr ptr;
  71.   NodeBitmask nodes;
  72.   nodes.assign(NodeBitmask::Size, 
  73.        ((const NodeFailRep*)signal->getDataPtr())->theNodes);
  74.   for(m_activeCounters.first(ptr); !ptr.isNull(); m_activeCounters.next(ptr)){
  75.     if(nodes.overlaps(ptr.p->m_nodes)){
  76.       ActiveCounter::SignalDesc desc = ptr.p->m_signalDesc;
  77.       theData[desc.m_senderDataOffset] = ptr.p->m_senderData;
  78.       theData[desc.m_errorCodeOffset] = desc.m_nodeFailErrorCode;
  79.       Uint32 len = MAX(MAX(desc.m_senderDataOffset, desc.m_errorCodeOffset),
  80.        desc.m_senderRefOffset);
  81.       
  82.       NodeBitmask overlapping = ptr.p->m_nodes;
  83.       overlapping.bitAND(nodes);
  84.       Uint32 i = 0;
  85.       while((i = overlapping.find(i)) != NodeBitmask::NotFound){
  86. theData[desc.m_senderRefOffset] = numberToRef(desc.m_block, i);
  87. m_block.sendSignal(m_block.reference(), desc.m_gsn, signal, len+1,JBB);
  88. i++;
  89.       }
  90.     }
  91.   }
  92. }
  93. BlockReference
  94. SafeCounterManager::reference() const {
  95.   return m_block.reference();
  96. }
  97. void
  98. SafeCounterManager::progError(int line, int err_code, const char* extra){
  99.   m_block.progError(line, err_code, extra);
  100. }
  101. bool
  102. SafeCounterHandle::clearWaitingFor(SafeCounterManager& mgr, Uint32 nodeId)
  103. {
  104.   SafeCounterManager::ActiveCounterPtr ptr;
  105.   mgr.getPtr(ptr, m_activeCounterPtrI);
  106.   ptr.p->m_nodes.clear(nodeId);
  107.   
  108.   if (ptr.p->m_nodes.isclear()){
  109.     mgr.release(ptr);
  110.     m_activeCounterPtrI = RNIL;
  111.     return true;
  112.   }
  113.   return false;
  114. }
  115. SafeCounter::~SafeCounter(){
  116.   bool clear = m_count == 0;
  117.   bool isnull = m_ptr.i == RNIL;
  118.   m_activeCounterPtrI = m_ptr.i;
  119.   if(clear && isnull)
  120.     return;
  121.   if(clear && !isnull){
  122.     m_mgr.release(m_ptr);
  123.     m_activeCounterPtrI = RNIL;
  124.     return;
  125.   }
  126.   /**
  127.    * !clear && !isnull
  128.    */
  129.   if(!isnull){
  130.     m_ptr.p->m_nodes = m_nodes;
  131.     return;
  132.   }
  133.   ErrorReporter::handleAssert("~SafeCounter:: wo/ init", __FILE__, __LINE__);
  134. }