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

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 SIMULATEDBLOCK_H
  14. #define SIMULATEDBLOCK_H
  15. #include <NdbTick.h>
  16. #include <kernel_types.h>
  17. #include <ndb_version.h>
  18. #include "VMSignal.hpp"
  19. #include <RefConvert.hpp>
  20. #include <BlockNumbers.h>
  21. #include <GlobalSignalNumbers.h>
  22. #include "pc.hpp"
  23. #include <NodeInfo.hpp>
  24. #include <NodeState.hpp>
  25. #include "GlobalData.hpp"
  26. #include "LongSignal.hpp"
  27. #include <SignalLoggerManager.hpp>
  28. #include <Error.hpp>
  29. #include <ErrorReporter.hpp>
  30. #include <ErrorHandlingMacros.hpp>
  31. #include "DLList.hpp"
  32. #include "ArrayPool.hpp"
  33. #include "DLHashTable.hpp"
  34. #include "Callback.hpp"
  35. #include "SafeCounter.hpp"
  36. #include "MetaData.hpp"
  37. #include <mgmapi.h>
  38. #include <mgmapi_config_parameters.h>
  39. #include <mgmapi_config_parameters_debug.h>
  40. #include <kernel_config_parameters.h>
  41. #include <Configuration.hpp>
  42. #include <signaldata/ReadConfig.hpp>
  43. #include <signaldata/UpgradeStartup.hpp>
  44. /**
  45.  * Something for filesystem access
  46.  */
  47. struct  NewBaseAddrBits              /* 32 bits */
  48. {
  49.   unsigned int     q               : 4;    /* Highest index - 2log */
  50.   /* Strings are treated as 16 bit indexed        */
  51.   /* variables with the number of characters in   */
  52.   /* index 0, byte 0                              */
  53.   unsigned int     v               : 3;    /* Size in bits - 2log */
  54.   unsigned int     unused : 25 ;
  55. };
  56. typedef struct NewVar
  57. {
  58.   Uint32 *              WA;
  59.   Uint32                nrr;
  60.   Uint32                ClusterSize;    /* Real Cluster size    */
  61.   NewBaseAddrBits       bits;
  62. } NewVARIABLE;  /* 128 bits */
  63. class SimulatedBlock {
  64.   friend class SafeCounter;
  65.   friend class SafeCounterManager;
  66.   friend struct UpgradeStartup;
  67. public:
  68.   friend class BlockComponent;
  69.   virtual ~SimulatedBlock();
  70.   
  71. protected:
  72.   /**
  73.    * Constructor
  74.    */
  75.   SimulatedBlock(BlockNumber blockNumber,
  76.                  const class Configuration & theConfiguration); 
  77.   /**********************************************************
  78.    * Handling of execFunctions
  79.    */
  80.   typedef void (SimulatedBlock::* ExecFunction)(Signal* signal);
  81.   void addRecSignalImpl(GlobalSignalNumber g, ExecFunction fun, bool f =false);
  82.   void installSimulatedBlockFunctions();
  83.   ExecFunction theExecArray[MAX_GSN+1];
  84. public:
  85.   /**
  86.    * 
  87.    */
  88.   inline void executeFunction(GlobalSignalNumber gsn, Signal* signal);
  89. public:
  90.   typedef void (SimulatedBlock::* CallbackFunction)(class Signal*, 
  91.     Uint32 callbackData,
  92.     Uint32 returnCode);
  93.   struct Callback {
  94.     CallbackFunction m_callbackFunction;
  95.     Uint32 m_callbackData;
  96.   };
  97. protected:
  98.   static Callback TheEmptyCallback;
  99.   void execute(Signal* signal, Callback & c, Uint32 returnCode);
  100.   
  101.   
  102.   /**********************************************************
  103.    * Send signal - dialects
  104.    */
  105.   void sendSignal(BlockReference ref, 
  106.   GlobalSignalNumber gsn, 
  107.                   Signal* signal, 
  108.   Uint32 length, 
  109.   JobBufferLevel jbuf ) const ;
  110.   void sendSignal(NodeReceiverGroup rg,
  111.   GlobalSignalNumber gsn, 
  112.                   Signal* signal, 
  113.   Uint32 length, 
  114.   JobBufferLevel jbuf ) const ;
  115.   void sendSignal(BlockReference ref, 
  116.   GlobalSignalNumber gsn, 
  117.                   Signal* signal, 
  118.   Uint32 length, 
  119.   JobBufferLevel jbuf,
  120.   LinearSectionPtr ptr[3],
  121.   Uint32 noOfSections) const ;
  122.   
  123.   void sendSignal(NodeReceiverGroup rg, 
  124.   GlobalSignalNumber gsn, 
  125.                   Signal* signal, 
  126.   Uint32 length, 
  127.   JobBufferLevel jbuf,
  128.   LinearSectionPtr ptr[3],
  129.   Uint32 noOfSections) const ;
  130.   // Send multiple signal with delay. In this VM the jobbufffer level has 
  131.   // no effect on on delayed signals
  132.   //
  133.   void sendSignalWithDelay(BlockReference ref, 
  134.    GlobalSignalNumber gsn, 
  135.                            Signal* signal,
  136.                            Uint32 delayInMilliSeconds, 
  137.    Uint32 length) const ;
  138.   void EXECUTE_DIRECT(Uint32 block, 
  139.       Uint32 gsn, 
  140.       Signal* signal, 
  141.       Uint32 len);
  142.   
  143.   class SectionSegmentPool& getSectionSegmentPool();
  144.   void releaseSections(Signal* signal);
  145.   /**********************************************************
  146.    * Fragmented signals
  147.    */
  148.   
  149.   /**
  150.    * Assemble fragments
  151.    *
  152.    * @return true if all fragments has arrived
  153.    *         false otherwise
  154.    */
  155.   bool assembleFragments(Signal * signal);
  156.   
  157.   void sendFragmentedSignal(BlockReference ref, 
  158.     GlobalSignalNumber gsn, 
  159.     Signal* signal, 
  160.     Uint32 length, 
  161.     JobBufferLevel jbuf,
  162.     Callback & = TheEmptyCallback,
  163.     Uint32 messageSize = 240);
  164.   void sendFragmentedSignal(NodeReceiverGroup rg, 
  165.     GlobalSignalNumber gsn, 
  166.     Signal* signal, 
  167.     Uint32 length, 
  168.     JobBufferLevel jbuf,
  169.     Callback & = TheEmptyCallback,
  170.     Uint32 messageSize = 240);
  171.   void sendFragmentedSignal(BlockReference ref, 
  172.     GlobalSignalNumber gsn, 
  173.     Signal* signal, 
  174.     Uint32 length, 
  175.     JobBufferLevel jbuf,
  176.     LinearSectionPtr ptr[3],
  177.     Uint32 noOfSections,
  178.     Callback &,
  179.     Uint32 messageSize = 240);
  180.   void sendFragmentedSignal(NodeReceiverGroup rg, 
  181.     GlobalSignalNumber gsn, 
  182.     Signal* signal, 
  183.     Uint32 length, 
  184.     JobBufferLevel jbuf,
  185.     LinearSectionPtr ptr[3],
  186.     Uint32 noOfSections,
  187.     Callback &,
  188.     Uint32 messageSize = 240);
  189.   /**********************************************************
  190.    * Fragmented signals structures
  191.    */
  192.   /**
  193.    * Struct used when assembling fragmented long signals at receiver side
  194.    */
  195.   struct FragmentInfo {
  196.     FragmentInfo(Uint32 fragId, Uint32 sender);
  197.     
  198.     Uint32 m_senderRef;
  199.     Uint32 m_fragmentId;
  200.     Uint32 m_sectionPtrI[3];
  201.     union {
  202.       Uint32 nextPool;
  203.       Uint32 nextHash;
  204.     };
  205.     Uint32 prevHash;
  206.     
  207.     inline bool equal(FragmentInfo & p) const {
  208.       return m_senderRef == p.m_senderRef && m_fragmentId == p.m_fragmentId;
  209.     }
  210.     
  211.     inline Uint32 hashValue() const {
  212.       return m_senderRef + m_fragmentId ;
  213.     }
  214.   }; // sizeof() = 32 bytes
  215.   
  216.   /**
  217.    * Struct used when sending fragmented signals
  218.    */
  219.   struct FragmentSendInfo {
  220.     FragmentSendInfo();
  221.     
  222.     enum Status {
  223.       SendNotComplete = 0,
  224.       SendComplete    = 1
  225.     };
  226.     Uint8  m_status;
  227.     Uint8  m_prio;
  228.     Uint16  m_fragInfo;
  229.     Uint16 m_gsn;
  230.     Uint16 m_messageSize; // Size of each fragment
  231.     Uint32 m_fragmentId;
  232.     union {
  233.       Ptr<struct SectionSegment> m_segmented;
  234.       LinearSectionPtr m_linear;
  235.     } m_sectionPtr[3];
  236.     LinearSectionPtr m_theDataSection;
  237.     NodeReceiverGroup m_nodeReceiverGroup; // 3
  238.     Callback m_callback;
  239.     union  {
  240.       Uint32 nextPool;
  241.       Uint32 nextList;
  242.     };
  243.     Uint32 prevList;
  244.   };
  245.   
  246.   /**
  247.    * setupFragmentSendInfo
  248.    *   Setup a struct to be used with sendSignalFragment
  249.    *   Used by sendFragmentedSignal
  250.    */
  251.   bool sendFirstFragment(FragmentSendInfo & info,
  252.  NodeReceiverGroup rg, 
  253.  GlobalSignalNumber gsn, 
  254.  Signal* signal, 
  255.  Uint32 length, 
  256.  JobBufferLevel jbuf,
  257.  LinearSectionPtr ptr[3],
  258.  Uint32 noOfSections,
  259.  Uint32 messageSize = 240);
  260.   
  261.   bool sendFirstFragment(FragmentSendInfo & info,
  262.  NodeReceiverGroup rg, 
  263.  GlobalSignalNumber gsn, 
  264.  Signal* signal, 
  265.  Uint32 length, 
  266.  JobBufferLevel jbuf,
  267.  Uint32 messageSize = 240);
  268.   
  269.   /**
  270.    * Send signal fragment
  271.    *
  272.    * @see sendFragmentedSignal
  273.    */
  274.   void sendNextSegmentedFragment(Signal* signal, FragmentSendInfo & info);
  275.   /**
  276.    * Send signal fragment
  277.    *
  278.    * @see sendFragmentedSignal
  279.    */
  280.   void sendNextLinearFragment(Signal* signal, FragmentSendInfo & info);
  281.   
  282.   BlockNumber    number() const;
  283.   BlockReference reference() const;
  284.   NodeId         getOwnNodeId() const;
  285.   /**
  286.    * Refresh Watch Dog in initialising code
  287.    *
  288.    */
  289.   void refresh_watch_dog();
  290.   /**
  291.    * Prog error
  292.    * This function should be called when this node should be shutdown
  293.    * If the cause of the shutdown is known use extradata to add an 
  294.    * errormessage describing the problem
  295.    */
  296.   void progError(int line, int err_code, const char* extradata=NULL) const ;
  297. private:
  298.   void  signal_error(Uint32, Uint32, Uint32, const char*, int) const ;
  299.   const NodeId         theNodeId;
  300.   const BlockNumber    theNumber;
  301.   const BlockReference theReference;
  302.   
  303. protected:
  304.   NewVARIABLE* allocateBat(int batSize);
  305.   void freeBat();
  306.   static const NewVARIABLE* getBat    (BlockNumber blockNo);
  307.   static Uint16             getBatSize(BlockNumber blockNo);
  308.   
  309.   static BlockReference calcTcBlockRef   (NodeId aNode);
  310.   static BlockReference calcLqhBlockRef  (NodeId aNode);
  311.   static BlockReference calcAccBlockRef  (NodeId aNode);
  312.   static BlockReference calcTupBlockRef  (NodeId aNode);
  313.   static BlockReference calcTuxBlockRef  (NodeId aNode);
  314.   static BlockReference calcDihBlockRef  (NodeId aNode);
  315.   static BlockReference calcQmgrBlockRef (NodeId aNode);
  316.   static BlockReference calcDictBlockRef (NodeId aNode);
  317.   static BlockReference calcNdbCntrBlockRef (NodeId aNode);
  318.   static BlockReference calcTrixBlockRef (NodeId aNode);
  319.   static BlockReference calcBackupBlockRef (NodeId aNode);
  320.   static BlockReference calcSumaBlockRef (NodeId aNode);
  321.   static BlockReference calcApiClusterMgrBlockRef (NodeId aNode);
  322.   /** 
  323.    * allocRecord
  324.    * Allocates memory for the datastructures where ndb keeps the data
  325.    *
  326.    */
  327.   void* allocRecord(const char * type, size_t s, size_t n, bool clear = true);
  328.   
  329.   /**
  330.    * Deallocate record
  331.    *
  332.    * NOTE: Also resets pointer
  333.    */
  334.   void deallocRecord(void **, const char * type, size_t s, size_t n);
  335.   
  336.   /**
  337.    * General info event (sent to cluster log)
  338.    */
  339.   void infoEvent(const char * msg, ...) const ;
  340.   void warningEvent(const char * msg, ...) const ;
  341.   
  342.   /**
  343.    * The configuration object
  344.    */
  345.   const class Configuration & theConfiguration;
  346.   /**
  347.    * Get node state
  348.    */
  349.   const NodeState & getNodeState() const;
  350.   /**
  351.    * Get node info
  352.    */
  353.   const NodeInfo & getNodeInfo(NodeId nodeId) const;
  354.   NodeInfo & setNodeInfo(NodeId);
  355.   
  356. private:
  357.   NewVARIABLE* NewVarRef;      /* New Base Address Table for block  */
  358.   Uint16       theBATSize;     /* # entries in BAT */
  359.   /**
  360.    * Node state
  361.    */
  362.   NodeState theNodeState;
  363.   void execNDB_TAMPER(Signal * signal);
  364.   void execNODE_STATE_REP(Signal* signal);
  365.   void execCHANGE_NODE_STATE_REQ(Signal* signal);
  366.   void execSIGNAL_DROPPED_REP(Signal* signal);
  367.   void execCONTINUE_FRAGMENTED(Signal* signal);
  368.   Uint32 c_fragmentIdCounter;
  369.   ArrayPool<FragmentInfo> c_fragmentInfoPool;
  370.   DLHashTable<FragmentInfo> c_fragmentInfoHash;
  371.   
  372.   bool c_fragSenderRunning;
  373.   ArrayPool<FragmentSendInfo> c_fragmentSendPool;
  374.   DLList<FragmentSendInfo> c_linearFragmentSendList;
  375.   DLList<FragmentSendInfo> c_segmentedFragmentSendList;
  376.   
  377. public: 
  378.   class MutexManager {
  379.     friend class Mutex;
  380.     friend class SimulatedBlock;
  381.     friend class DbUtil;
  382.   public:
  383.     MutexManager(class SimulatedBlock &);
  384.     
  385.     bool setSize(Uint32 maxNoOfActiveMutexes);
  386.     Uint32 getSize() const ; // Get maxNoOfActiveMutexes
  387.     
  388.   private:
  389.     /**
  390.      * core interface
  391.      */
  392.     struct ActiveMutex {
  393.       Uint32 m_gsn; // state
  394.       Uint32 m_mutexId;
  395.       Uint32 m_mutexKey;
  396.       Callback m_callback;
  397.       union {
  398. Uint32 nextPool;
  399. Uint32 nextList;
  400.       };
  401.       Uint32 prevList;
  402.     };
  403.     typedef Ptr<ActiveMutex> ActiveMutexPtr;
  404.     
  405.     bool seize(ActiveMutexPtr& ptr);
  406.     void release(Uint32 activeMutexPtrI);
  407.     
  408.     void getPtr(ActiveMutexPtr& ptr);
  409.     
  410.     void create(Signal*, ActiveMutexPtr&);
  411.     void destroy(Signal*, ActiveMutexPtr&);
  412.     void lock(Signal*, ActiveMutexPtr&);
  413.     void trylock(Signal*, ActiveMutexPtr&);
  414.     void unlock(Signal*, ActiveMutexPtr&);
  415.     
  416.   private:
  417.     void execUTIL_CREATE_LOCK_REF(Signal* signal);
  418.     void execUTIL_CREATE_LOCK_CONF(Signal* signal);
  419.     void execUTIL_DESTORY_LOCK_REF(Signal* signal);
  420.     void execUTIL_DESTORY_LOCK_CONF(Signal* signal);
  421.     void execUTIL_LOCK_REF(Signal* signal);
  422.     void execUTIL_LOCK_CONF(Signal* signal);
  423.     void execUTIL_UNLOCK_REF(Signal* signal);
  424.     void execUTIL_UNLOCK_CONF(Signal* signal);
  425.     
  426.     SimulatedBlock & m_block;
  427.     ArrayPool<ActiveMutex> m_mutexPool;
  428.     DLList<ActiveMutex> m_activeMutexes;
  429.     
  430.     BlockReference reference() const;
  431.     void progError(int line, int err_code, const char* extra = 0);
  432.   };
  433.   
  434.   friend class MutexManager;
  435.   MutexManager c_mutexMgr;
  436.   void ignoreMutexUnlockCallback(Signal* signal, Uint32 ptrI, Uint32 retVal);
  437.   SafeCounterManager c_counterMgr;
  438. private:
  439.   void execUTIL_CREATE_LOCK_REF(Signal* signal);
  440.   void execUTIL_CREATE_LOCK_CONF(Signal* signal);
  441.   void execUTIL_DESTORY_LOCK_REF(Signal* signal);
  442.   void execUTIL_DESTORY_LOCK_CONF(Signal* signal);
  443.   void execUTIL_LOCK_REF(Signal* signal);
  444.   void execUTIL_LOCK_CONF(Signal* signal);
  445.   void execUTIL_UNLOCK_REF(Signal* signal);
  446.   void execUTIL_UNLOCK_CONF(Signal* signal);
  447.   void execREAD_CONFIG_REQ(Signal* signal);
  448. protected:
  449.   void execUPGRADE(Signal* signal);
  450.   void fsRefError(Signal* signal, Uint32 line, const char *msg);
  451.   void execFSWRITEREF(Signal* signal);
  452.   void execFSREADREF(Signal* signal);
  453.   void execFSOPENREF(Signal* signal);
  454.   void execFSCLOSEREF(Signal* signal);
  455.   void execFSREMOVEREF(Signal* signal);
  456.   void execFSSYNCREF(Signal* signal);
  457.   void execFSAPPENDREF(Signal* signal);
  458.   // Variable for storing inserted errors, see pc.H
  459.   ERROR_INSERT_VARIABLE;
  460. private:
  461.   // Metadata common part shared by block instances
  462.   MetaData::Common* c_ptrMetaDataCommon;
  463. public:
  464.   void setMetaDataCommon(MetaData::Common* ptr) { c_ptrMetaDataCommon = ptr; }
  465.   MetaData::Common* getMetaDataCommon() { return c_ptrMetaDataCommon; }
  466. #ifdef VM_TRACE_TIME
  467. public:
  468.   void clearTimes();
  469.   void printTimes(FILE * output);
  470.   void addTime(Uint32 gsn, Uint64 time);
  471.   void subTime(Uint32 gsn, Uint64 time);
  472.   struct TimeTrace {
  473.     Uint32 cnt;
  474.     Uint64 sum, sub;
  475.   } m_timeTrace[MAX_GSN+1];
  476.   Uint32 m_currentGsn;
  477. #endif
  478. #ifdef VM_TRACE
  479.   Ptr<void> **m_global_variables;
  480.   void clear_global_variables();
  481.   void init_globals_list(void ** tmp, size_t cnt);
  482. #endif
  483. };
  484. inline 
  485. void 
  486. SimulatedBlock::executeFunction(GlobalSignalNumber gsn, Signal* signal){
  487.   ExecFunction f = theExecArray[gsn];
  488.   if(gsn <= MAX_GSN && f != 0){
  489. #ifdef VM_TRACE
  490.     clear_global_variables();
  491. #endif
  492.     (this->*f)(signal);
  493.     return;
  494.   }
  495.   /**
  496.    * This point only passed if an error has occurred
  497.    */
  498.   char errorMsg[255];
  499.   if (!(gsn <= MAX_GSN)) {
  500.     BaseString::snprintf(errorMsg, 255, "Illegal signal received (GSN %d too high)", gsn);
  501.     ERROR_SET(fatal, ERR_ERROR_PRGERR, errorMsg, errorMsg);
  502.   }
  503.   if (!(theExecArray[gsn] != 0)) {
  504.     BaseString::snprintf(errorMsg, 255, "Illegal signal received (GSN %d not added)", gsn);
  505.     ERROR_SET(fatal, ERR_ERROR_PRGERR, errorMsg, errorMsg);
  506.   }
  507.   ndbrequire(false);
  508. }
  509. inline
  510. void
  511. SimulatedBlock::execute(Signal* signal, Callback & c, Uint32 returnCode){
  512.   CallbackFunction fun = c.m_callbackFunction; 
  513.   ndbrequire(fun != 0);
  514.   c.m_callbackFunction = NULL;
  515.   (this->*fun)(signal, c.m_callbackData, returnCode);
  516. }
  517. inline 
  518. BlockNumber
  519. SimulatedBlock::number() const {
  520.    return theNumber;
  521. }
  522. inline
  523. BlockReference
  524. SimulatedBlock::reference() const {
  525.    return theReference;
  526. }
  527. inline
  528. NodeId
  529. SimulatedBlock::getOwnNodeId() const {
  530.   return theNodeId;
  531. }
  532. inline
  533. BlockReference
  534. SimulatedBlock::calcTcBlockRef   (NodeId aNodeId){
  535.   return numberToRef(DBTC, aNodeId);
  536. }
  537. inline
  538. BlockReference
  539. SimulatedBlock::calcLqhBlockRef  (NodeId aNodeId){
  540. return numberToRef(DBLQH, aNodeId);
  541. }
  542. inline
  543. BlockReference
  544. SimulatedBlock::calcAccBlockRef  (NodeId aNodeId){
  545.   return numberToRef(DBACC, aNodeId);
  546. }
  547. inline
  548. BlockReference
  549. SimulatedBlock::calcTupBlockRef  (NodeId aNodeId){
  550.   return numberToRef(DBTUP, aNodeId);
  551. }
  552. inline
  553. BlockReference
  554. SimulatedBlock::calcTuxBlockRef  (NodeId aNodeId){
  555.   return numberToRef(DBTUX, aNodeId);
  556. }
  557. inline
  558. BlockReference
  559. SimulatedBlock::calcDihBlockRef  (NodeId aNodeId){
  560.   return numberToRef(DBDIH, aNodeId);
  561. }
  562. inline
  563. BlockReference
  564. SimulatedBlock::calcDictBlockRef (NodeId aNodeId){
  565.   return numberToRef(DBDICT, aNodeId);
  566. }
  567. inline
  568. BlockReference
  569. SimulatedBlock::calcQmgrBlockRef (NodeId aNodeId){
  570.   return numberToRef(QMGR, aNodeId);
  571. }
  572. inline
  573. BlockReference
  574. SimulatedBlock::calcNdbCntrBlockRef (NodeId aNodeId){
  575.   return numberToRef(NDBCNTR, aNodeId);
  576. }
  577. inline
  578. BlockReference
  579. SimulatedBlock::calcTrixBlockRef (NodeId aNodeId){
  580.   return numberToRef(TRIX, aNodeId);
  581. }
  582. inline
  583. BlockReference
  584. SimulatedBlock::calcBackupBlockRef (NodeId aNodeId){
  585.   return numberToRef(BACKUP, aNodeId);
  586. }
  587. inline
  588. BlockReference
  589. SimulatedBlock::calcSumaBlockRef (NodeId aNodeId){
  590.   return numberToRef(SUMA, aNodeId);
  591. }
  592. inline
  593. BlockReference
  594. SimulatedBlock::calcApiClusterMgrBlockRef (NodeId aNodeId){
  595.   return numberToRef(API_CLUSTERMGR, aNodeId);
  596. }
  597. inline
  598. const NodeState &
  599. SimulatedBlock::getNodeState() const {
  600.   return theNodeState;
  601. }
  602. inline
  603. const NodeInfo &
  604. SimulatedBlock::getNodeInfo(NodeId nodeId) const {
  605.   ndbrequire(nodeId > 0 && nodeId < MAX_NODES);
  606.   return globalData.m_nodeInfo[nodeId];
  607. }
  608. inline
  609. void
  610. SimulatedBlock::EXECUTE_DIRECT(Uint32 block, 
  611.        Uint32 gsn, 
  612.        Signal* signal, 
  613.        Uint32 len){
  614.   signal->setLength(len);
  615. #ifdef VM_TRACE
  616.   if(globalData.testOn){
  617.     signal->header.theVerId_signalNumber = gsn;
  618.     signal->header.theReceiversBlockNumber = block;
  619.     signal->header.theSendersBlockRef = reference();
  620.     globalSignalLoggers.executeDirect(signal->header,
  621.       0,        // in
  622.       &signal->theData[0],
  623.                                       globalData.ownId);
  624.   }
  625. #endif
  626.   SimulatedBlock* b = globalData.getBlock(block);
  627. #ifdef VM_TRACE_TIME
  628.   Uint32 us1, us2;
  629.   Uint64 ms1, ms2;
  630.   NdbTick_CurrentMicrosecond(&ms1, &us1);
  631.   Uint32 tGsn = m_currentGsn;
  632.   b->m_currentGsn = gsn;
  633. #endif
  634.   b->executeFunction(gsn, signal);
  635. #ifdef VM_TRACE_TIME
  636.   NdbTick_CurrentMicrosecond(&ms2, &us2);
  637.   Uint64 diff = ms2;
  638.   diff -= ms1;
  639.   diff *= 1000000;
  640.   diff += us2;
  641.   diff -= us1;
  642.   b->addTime(gsn, diff);
  643.   m_currentGsn = tGsn;
  644.   subTime(tGsn, diff);
  645. #endif
  646. #ifdef VM_TRACE
  647.   if(globalData.testOn){
  648.     signal->header.theVerId_signalNumber = gsn;
  649.     signal->header.theReceiversBlockNumber = block;
  650.     signal->header.theSendersBlockRef = reference();
  651.     globalSignalLoggers.executeDirect(signal->header,
  652.       1,        // out
  653.       &signal->theData[0],
  654.                                       globalData.ownId);
  655.   }
  656. #endif
  657. }
  658. #ifdef VM_TRACE_TIME
  659. inline
  660. void
  661. SimulatedBlock::addTime(Uint32 gsn, Uint64 time){
  662.   m_timeTrace[gsn].cnt ++;
  663.   m_timeTrace[gsn].sum += time;
  664. }
  665. inline
  666. void
  667. SimulatedBlock::subTime(Uint32 gsn, Uint64 time){
  668.   m_timeTrace[gsn].sub += time;
  669. }
  670. #endif
  671. /**
  672.  * Defines for backward compatiblility
  673.  */
  674. #define BLOCK_DEFINES(BLOCK) 
  675.   typedef void (BLOCK::* ExecSignalLocal) (Signal* signal); 
  676.   typedef void (BLOCK::* BlockCallback)(Signal*, Uint32 callb, Uint32 retCode); 
  677.   inline CallbackFunction safe_cast(BlockCallback f){ 
  678.     return static_cast<CallbackFunction>(f); 
  679.   } 
  680. public:
  681. private: 
  682.   void addRecSignal(GlobalSignalNumber gsn, ExecSignalLocal f, bool force = false)
  683. #define BLOCK_CONSTRUCTOR(BLOCK)
  684. #define BLOCK_FUNCTIONS(BLOCK) 
  685. void 
  686. BLOCK::addRecSignal(GlobalSignalNumber gsn, ExecSignalLocal f, bool force){ 
  687.   addRecSignalImpl(gsn, (ExecFunction)f, force);
  688. }
  689. #include "Mutex.hpp"
  690. #endif