VMSignal.hpp
上传用户: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. #ifndef VMSignal_H
  14. #define VMSignal_H
  15. #include <ndb_global.h>
  16. #include <ndb_limits.h>
  17. #include <kernel_types.h>
  18. #include <ErrorReporter.hpp>
  19. #include <NodeBitmask.hpp>
  20. #include <RefConvert.hpp>
  21. #include <TransporterDefinitions.hpp>
  22. /**
  23.  * Struct used when sending to multiple blocks
  24.  */
  25. struct NodeReceiverGroup {
  26.   NodeReceiverGroup();
  27.   NodeReceiverGroup(Uint32 blockRef);
  28.   NodeReceiverGroup(Uint32 blockNo, const NodeBitmask &);
  29.   NodeReceiverGroup(Uint32 blockNo, const class SignalCounter &);
  30.   
  31.   NodeReceiverGroup& operator=(BlockReference ref);
  32.   
  33.   Uint32 m_block;
  34.   NodeBitmask m_nodes;
  35. };
  36. /**
  37.  * class used for passing argumentes to blocks
  38.  */
  39. class Signal {
  40.   friend class SimulatedBlock;
  41.   friend class APZJobBuffer;
  42.   friend class FastScheduler;
  43. public:
  44.   Signal();
  45.   
  46.   Uint32 getLength() const;
  47.   Uint32 getTrace() const;
  48.   Uint32 getSendersBlockRef() const;
  49.   const Uint32* getDataPtr() const ;
  50.   Uint32* getDataPtrSend() ;
  51.   
  52.   void setTrace(Uint32);
  53.   Uint32 getNoOfSections() const;
  54.   bool getSection(SegmentedSectionPtr & ptr, Uint32 sectionNo);
  55.   void setSection(SegmentedSectionPtr ptr, Uint32 sectionNo);
  56.   /**
  57.    * Old depricated methods...
  58.    */
  59.   Uint32 length() const { return getLength();}
  60.   BlockReference senderBlockRef() const { return getSendersBlockRef();}
  61. private:
  62.   void setLength(Uint32);
  63.   
  64. public:
  65. #define VMS_DATA_SIZE 
  66.   (MAX_ATTRIBUTES_IN_TABLE + MAX_TUPLE_SIZE_IN_WORDS + MAX_KEY_SIZE_IN_WORDS)
  67.   SignalHeader header; // 28 bytes
  68.   SegmentedSectionPtr m_sectionPtr[3]; 
  69.   Uint32 theData[25+VMS_DATA_SIZE];  // 2048 32-bit words -> 8K Bytes
  70.   
  71.   void garbage_register();
  72. };
  73. inline
  74. Uint32
  75. Signal::getLength() const {
  76.   return header.theLength;
  77. }
  78. inline
  79. Uint32
  80. Signal::getTrace() const {
  81.   return header.theTrace;
  82. }
  83. inline
  84. Uint32
  85. Signal::getSendersBlockRef() const {
  86.   return header.theSendersBlockRef;
  87. }
  88. inline
  89. const Uint32* 
  90. Signal::getDataPtr() const { 
  91.   return &theData[0];
  92. }
  93. inline
  94. Uint32* 
  95. Signal::getDataPtrSend() { 
  96.   return &theData[0];
  97. }
  98. inline
  99. void
  100. Signal::setLength(Uint32 len){
  101.   header.theLength = len;
  102. }
  103. inline
  104. void
  105. Signal::setTrace(Uint32 t){
  106.   header.theTrace = t;
  107. }
  108. inline
  109. Uint32 
  110. Signal::getNoOfSections() const {
  111.   return header.m_noOfSections;
  112. }
  113. inline
  114. bool 
  115. Signal::getSection(SegmentedSectionPtr & ptr, Uint32 section){
  116.   if(section < header.m_noOfSections){
  117.     ptr = m_sectionPtr[section];
  118.     return true;
  119.   }
  120.   ptr.p = 0;
  121.   return false;
  122. }
  123. inline
  124. void
  125. Signal::setSection(SegmentedSectionPtr ptr, Uint32 sectionNo){
  126.   if(sectionNo != header.m_noOfSections || sectionNo > 2){
  127.     abort();
  128.   }
  129.   m_sectionPtr[sectionNo] = ptr;
  130.   header.m_noOfSections++;
  131. }
  132. inline
  133. NodeReceiverGroup::NodeReceiverGroup() : m_block(0){
  134.   m_nodes.clear();
  135. }
  136. inline
  137. NodeReceiverGroup::NodeReceiverGroup(Uint32 blockRef){
  138.   m_nodes.clear();
  139.   m_block = refToBlock(blockRef);
  140.   m_nodes.set(refToNode(blockRef));
  141. }
  142. inline
  143. NodeReceiverGroup::NodeReceiverGroup(Uint32 blockNo, const NodeBitmask & nodes){
  144.   m_block = blockNo;
  145.   m_nodes = nodes;
  146. }
  147. #include "SignalCounter.hpp"
  148. inline
  149. NodeReceiverGroup::NodeReceiverGroup(Uint32 blockNo, const SignalCounter & nodes){
  150.   m_block = blockNo;
  151.   m_nodes = nodes.m_nodes;
  152. }
  153. inline
  154. NodeReceiverGroup& 
  155. NodeReceiverGroup::operator=(BlockReference blockRef){
  156.   m_nodes.clear();
  157.   m_block = refToBlock(blockRef);
  158.   m_nodes.set(refToNode(blockRef));
  159.   return * this;
  160. }
  161. #endif