dba_process.cpp
上传用户: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. #include "dba_process.hpp"
  14. NewtonBatchProcess::NewtonBatchProcess(Ndb & ndb, NdbMutex & mutex) : 
  15.   theNdb(ndb),
  16.   theMutex(mutex)
  17. {
  18.   theThread = 0;
  19.   startStopMutex = NdbMutex_Create();
  20.   _running = false;
  21.   _stop = false;
  22. NewtonBatchProcess::~NewtonBatchProcess(){
  23.   doStop(true);
  24.   if(theThread != 0)
  25.     NdbThread_Destroy(&theThread);
  26.   
  27.   if(startStopMutex != 0)
  28.     NdbMutex_Destroy(startStopMutex);
  29.   startStopMutex = 0;
  30. }
  31. extern "C" 
  32. void* 
  33. runNDB_C(void * _nbp){
  34.   NewtonBatchProcess * nbp = (NewtonBatchProcess*)_nbp;
  35.   nbp->_running = true;
  36.   nbp->run();  
  37.   nbp->_running = false;
  38.   
  39.   /** 
  40.    *  This sleep is to make sure that the transporter 
  41.    *  send thread will come in and send any
  42.    *  signal buffers that this thread may have allocated.
  43.    *  If that doesn't happen an error will occur in OSE
  44.    *  when trying to restore a signal buffer allocated by a thread
  45.    *  that have been killed.
  46.    */
  47.   NdbSleep_MilliSleep(50);
  48.   NdbThread_Exit(0);
  49.   return 0;
  50. }
  51. void
  52. NewtonBatchProcess::doStart(){
  53.   NdbMutex_Lock(startStopMutex);
  54.   if(_running && !_stop){
  55.     NdbMutex_Unlock(startStopMutex);
  56.     return ;
  57.   }
  58.   
  59.   while(_running){
  60.     NdbMutex_Unlock(startStopMutex);
  61.     NdbSleep_MilliSleep(200);
  62.     NdbMutex_Lock(startStopMutex);
  63.   }
  64.   
  65.   require(!_running);
  66.   _stop = false;
  67.   
  68.   if(theThread != 0)
  69.     NdbThread_Destroy(&theThread);
  70.   
  71.   theThread = NdbThread_Create(runNDB_C,
  72.        (void**)this,
  73.        65535,
  74.        "Newton_BP",
  75.        NDB_THREAD_PRIO_LOWEST);
  76.   
  77.   NdbMutex_Unlock(startStopMutex);
  78. }
  79. void
  80. NewtonBatchProcess::doStop(bool wait){
  81.   NdbMutex_Lock(startStopMutex);
  82.   _stop = true;
  83.   if(wait){
  84.     while(_running){
  85.       NdbSleep_MilliSleep(200);
  86.     }
  87.   }
  88.   NdbMutex_Unlock(startStopMutex);
  89. }
  90. bool
  91. NewtonBatchProcess::isRunning() const {
  92.   return _running;
  93. }
  94. bool
  95. NewtonBatchProcess::isStopping() const {
  96.   return _stop;
  97. }
  98. void
  99. NewtonBatchProcess::run(){
  100.   while(!_stop){
  101.     NdbMutex_Lock(&theMutex);
  102.     theNdb.sendPollNdb(0, 1, DBA__NBP_Force);
  103.     NdbMutex_Unlock(&theMutex);
  104.     NdbSleep_MilliSleep(DBA__NBP_Intervall);
  105.   }
  106. }