⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 watchdog.cpp

📁 MySQL数据库开发源码 值得一看哦
💻 CPP
字号:
/* Copyright (C) 2003 MySQL AB   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include <ndb_global.h>#include <my_pthread.h>#include "WatchDog.hpp"#include "GlobalData.hpp"#include <NdbOut.hpp>#include <NdbSleep.h>#include <ErrorHandlingMacros.hpp>   extern "C" void* runWatchDog(void* w){  ((WatchDog*)w)->run();  return NULL;}WatchDog::WatchDog(Uint32 interval) :   theIPValue(globalData.getWatchDogPtr()){  setCheckInterval(interval);  theStop = false;  theThreadPtr = 0;}WatchDog::~WatchDog(){  doStop();}Uint32WatchDog::setCheckInterval(Uint32 interval){  // An interval of less than 70ms is not acceptable  return theInterval = (interval < 70 ? 70 : interval);}voidWatchDog::doStart(){  theStop = false;  theThreadPtr = NdbThread_Create(runWatchDog, 				  (void**)this, 				  32768,				  "ndb_watchdog",                                  NDB_THREAD_PRIO_HIGH);}voidWatchDog::doStop(){  void *status;  theStop = true;  if(theThreadPtr){    NdbThread_WaitFor(theThreadPtr, &status);    NdbThread_Destroy(&theThreadPtr);  }}void WatchDog::run(){  unsigned int anIPValue;  unsigned int alerts = 0;  unsigned int oldIPValue = 0;    // WatchDog for the single threaded NDB  while(!theStop){    Uint32 tmp  = theInterval / 500;    tmp= (tmp ? tmp : 1);        while(!theStop && tmp > 0){      NdbSleep_MilliSleep(500);      tmp--;    }        if(theStop)      break;    // Verify that the IP thread is not stuck in a loop    anIPValue = *theIPValue;    if(anIPValue != 0) {      oldIPValue = anIPValue;      globalData.incrementWatchDogCounter(0);      alerts = 0;    } else {      const char *last_stuck_action;      alerts++;      switch (oldIPValue) {      case 1:        last_stuck_action = "Job Handling";        break;      case 2:        last_stuck_action = "Scanning Timers";        break;      case 3:        last_stuck_action = "External I/O";        break;      case 4:        last_stuck_action = "Print Job Buffers at crash";        break;      case 5:        last_stuck_action = "Checking connections";        break;      case 6:        last_stuck_action = "Performing Send";        break;      case 7:        last_stuck_action = "Polling for Receive";        break;      case 8:        last_stuck_action = "Performing Receive";        break;      default:        last_stuck_action = "Unknown place";        break;      }//switch      ndbout << "Ndb kernel is stuck in: " << last_stuck_action << endl;      if(alerts == 3){	shutdownSystem(last_stuck_action);      }    }  }  return;}voidWatchDog::shutdownSystem(const char *last_stuck_action){    ErrorReporter::handleError(NDBD_EXIT_WATCHDOG_TERMINATE,			     last_stuck_action,			     __FILE__,			     NST_Watchdog);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -