Monitor.cpp
上传用户: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. #include <ndb_global.h>
  14. #include <NdbThread.h>
  15. #include <NdbOut.hpp>
  16. #include <NdbSleep.h>
  17. #include "CPCD.hpp"
  18. #include "common.hpp"
  19. static void *
  20. monitor_thread_create_wrapper(void * arg) {
  21.   CPCD::Monitor *mon = (CPCD::Monitor *)arg;
  22.   mon->run();
  23.   return NULL;
  24. }
  25. CPCD::Monitor::Monitor(CPCD *cpcd, int poll) {
  26.   m_cpcd = cpcd;
  27.   m_pollingInterval = poll;
  28.   m_changeCondition = NdbCondition_Create();
  29.   m_changeMutex = NdbMutex_Create();
  30.   m_monitorThread = NdbThread_Create(monitor_thread_create_wrapper,
  31.      (NDB_THREAD_ARG*) this,
  32.      32768,
  33.      "ndb_cpcd_monitor",
  34.      NDB_THREAD_PRIO_MEAN);
  35.   m_monitorThreadQuitFlag = false;
  36. }
  37. CPCD::Monitor::~Monitor() {
  38.   NdbThread_Destroy(&m_monitorThread);
  39.   NdbCondition_Destroy(m_changeCondition);
  40.   NdbMutex_Destroy(m_changeMutex);
  41. }
  42. void
  43. CPCD::Monitor::run() {
  44.   while(1) {
  45.     NdbMutex_Lock(m_changeMutex);
  46.     NdbCondition_WaitTimeout(m_changeCondition,
  47.      m_changeMutex,
  48.      m_pollingInterval * 1000);
  49.     MutexVector<CPCD::Process *> &proc = *m_cpcd->getProcessList();
  50.     proc.lock();
  51.     for(size_t i = 0; i < proc.size(); i++) {
  52.       proc[i]->monitor();
  53.     }
  54.     proc.unlock();
  55.     NdbMutex_Unlock(m_changeMutex);
  56.   }
  57. }
  58. void
  59. CPCD::Monitor::signal() {
  60.   NdbCondition_Signal(m_changeCondition);
  61. }
  62. template class MutexVector<CPCD::Process*>;