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

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. #ifndef SIGNAL_COUNTER_HPP
  14. #define SIGNAL_COUNTER_HPP
  15. #include <NodeBitmask.hpp>
  16. #include <ErrorReporter.hpp>
  17. class SignalCounter {
  18.   friend struct NodeReceiverGroup;
  19.   
  20. private:
  21.   Uint32 m_count;
  22.   NdbNodeBitmask m_nodes;
  23. public:
  24.   SignalCounter() { clearWaitingFor();}
  25.   void clearWaitingFor();
  26.   
  27.   /**
  28.    * When sending to different node
  29.    */
  30.   void setWaitingFor(Uint32 nodeId);
  31.   void clearWaitingFor(Uint32 nodeId);
  32.   void forceClearWaitingFor(Uint32 nodeId);
  33.   
  34.   bool isWaitingFor(Uint32 nodeId) const;
  35.   bool done() const;
  36.   const char * getText() const;
  37.   SignalCounter& operator=(const NdbNodeBitmask & bitmask);
  38.   SignalCounter& operator=(const NodeReceiverGroup& rg) { 
  39.     return (* this) = rg.m_nodes;
  40.   }
  41.   /**
  42.    * When sending to same node
  43.    */
  44.   SignalCounter& operator=(Uint32 count);
  45.   SignalCounter& operator--(int);
  46.   SignalCounter& operator++(int);
  47.   SignalCounter& operator+=(Uint32);
  48.   Uint32 getCount() const;
  49. };
  50. inline
  51. void 
  52. SignalCounter::setWaitingFor(Uint32 nodeId) {
  53.   if(!m_nodes.get(nodeId)){
  54.     m_nodes.set(nodeId);
  55.     m_count++;
  56.     return;
  57.   }
  58.   ErrorReporter::handleAssert("SignalCounter::set", __FILE__, __LINE__);
  59. }
  60. inline
  61. bool
  62. SignalCounter::isWaitingFor(Uint32 nodeId) const {
  63.   return m_nodes.get(nodeId);
  64. }
  65. inline
  66. bool
  67. SignalCounter::done() const {
  68.   return m_count == 0;
  69. }
  70. inline
  71. Uint32
  72. SignalCounter::getCount() const {
  73.   return m_count;
  74. }
  75. inline
  76. void
  77. SignalCounter::clearWaitingFor(Uint32 nodeId) {
  78.   if(m_nodes.get(nodeId) && m_count > 0){
  79.     m_count--;
  80.     m_nodes.clear(nodeId);
  81.     return;
  82.   }
  83.   ErrorReporter::handleAssert("SignalCounter::clear", __FILE__, __LINE__);
  84. }
  85. inline
  86. void
  87. SignalCounter::clearWaitingFor(){
  88.   m_count = 0;
  89.   m_nodes.clear();
  90. }
  91. inline
  92. void
  93. SignalCounter::forceClearWaitingFor(Uint32 nodeId){
  94.   if(isWaitingFor(nodeId)){
  95.     clearWaitingFor(nodeId);
  96.   }
  97. }
  98. inline
  99. SignalCounter&
  100. SignalCounter::operator=(Uint32 count){
  101.   m_count = count;
  102.   m_nodes.clear();
  103.   return * this;
  104. }
  105. inline
  106. SignalCounter&
  107. SignalCounter::operator--(int){
  108.   if(m_count > 0){
  109.     m_count--;
  110.     return * this;
  111.   }
  112.   ErrorReporter::handleAssert("SignalCounter::operator--", __FILE__, __LINE__);
  113.   return * this;
  114. }
  115. inline
  116. SignalCounter&
  117. SignalCounter::operator++(int){
  118.   m_count++;
  119.   return * this;
  120. }
  121. inline
  122. SignalCounter&
  123. SignalCounter::operator+=(Uint32 n){
  124.   m_count += n;
  125.   return * this;
  126. }
  127. inline
  128. const char *
  129. SignalCounter::getText() const {
  130.   static char buf[255];
  131.   static char nodes[NodeBitmask::TextLength+1];
  132.   BaseString::snprintf(buf, sizeof(buf), "[SignalCounter: m_count=%d %s]", m_count, m_nodes.getText(nodes));
  133.   return buf;
  134. }
  135. inline
  136. SignalCounter&
  137. SignalCounter::operator=(const NdbNodeBitmask & bitmask){
  138.   m_nodes = bitmask;
  139.   m_count = bitmask.count();
  140.   return * this;
  141. }
  142. #endif