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

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 NDB_WAITER_HPP
  14. #define NDB_WAITER_HPP
  15. #include <ndb_global.h>
  16. #include <NdbOut.hpp>
  17. #include <NdbError.hpp>
  18. #include <NdbCondition.h>
  19. #include <NdbReceiver.hpp>
  20. #include <NdbOperation.hpp>
  21. #include <kernel/ndb_limits.h>
  22. #include <NdbTick.h>
  23. enum WaitSignalType { 
  24.   NO_WAIT           = 0,
  25.   WAIT_NODE_FAILURE = 1,  // Node failure during wait
  26.   WST_WAIT_TIMEOUT  = 2,  // Timeout during wait
  27.   WAIT_TC_SEIZE     = 3,
  28.   WAIT_TC_RELEASE   = 4,
  29.   WAIT_NDB_TAMPER   = 5,
  30.   WAIT_SCAN         = 6,
  31.   // DICT stuff
  32.   WAIT_GET_TAB_INFO_REQ = 11,
  33.   WAIT_CREATE_TAB_REQ = 12,
  34.   WAIT_DROP_TAB_REQ = 13,
  35.   WAIT_ALTER_TAB_REQ = 14,
  36.   WAIT_CREATE_INDX_REQ = 15,
  37.   WAIT_DROP_INDX_REQ = 16,
  38.   WAIT_LIST_TABLES_CONF = 17
  39. };
  40. class NdbWaiter {
  41. public:
  42.   NdbWaiter();
  43.   ~NdbWaiter();
  44.   void wait(int waitTime);
  45.   void nodeFail(Uint32 node);
  46.   void signal(Uint32 state);
  47.   Uint32 m_node;
  48.   Uint32 m_state;
  49.   void * m_mutex;
  50.   struct NdbCondition * m_condition;  
  51. };
  52. inline
  53. void
  54. NdbWaiter::wait(int waitTime)
  55. {
  56.   const bool forever = (waitTime == -1);
  57.   const NDB_TICKS maxTime = NdbTick_CurrentMillisecond() + waitTime;
  58.   while (1) {
  59.     if (m_state == NO_WAIT || m_state == WAIT_NODE_FAILURE)
  60.       break;
  61.     if (forever) {
  62.       NdbCondition_Wait(m_condition, (NdbMutex*)m_mutex);
  63.     } else {
  64.       if (waitTime <= 0) {
  65.         m_state = WST_WAIT_TIMEOUT;
  66.         break;
  67.       }
  68.       NdbCondition_WaitTimeout(m_condition, (NdbMutex*)m_mutex, waitTime);
  69.       waitTime = maxTime - NdbTick_CurrentMillisecond();
  70.     }
  71.   }
  72. }
  73. inline
  74. void
  75. NdbWaiter::nodeFail(Uint32 aNodeId){
  76.   if (m_state != NO_WAIT && m_node == aNodeId){
  77.     m_state = WAIT_NODE_FAILURE;
  78.     NdbCondition_Signal(m_condition);
  79.   }
  80. }
  81. inline
  82. void 
  83. NdbWaiter::signal(Uint32 state){
  84.   m_state = state;
  85.   NdbCondition_Signal(m_condition);
  86. }
  87. #endif