SignalQueue.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 "SignalQueue.hpp"
  15. SignalQueue::SignalQueue() {
  16.   m_mutex = NdbMutex_Create();
  17.   m_cond = NdbCondition_Create();
  18.   m_signalQueueHead = NULL;
  19. }
  20. SignalQueue::~SignalQueue() {
  21.   {
  22.     Guard g(m_mutex);
  23.     while(m_signalQueueHead != NULL)
  24.       delete pop();
  25.   }
  26.   NdbMutex_Destroy(m_mutex);
  27.   m_mutex = NULL;
  28.   NdbCondition_Destroy(m_cond);
  29.   m_cond = NULL;
  30. }
  31. NdbApiSignal *
  32. SignalQueue::pop() {
  33.   NdbApiSignal *ret;
  34.   if(m_signalQueueHead == NULL)
  35.     return NULL;
  36.   ret = m_signalQueueHead->signal;
  37.   QueueEntry *old = m_signalQueueHead;
  38.   m_signalQueueHead = m_signalQueueHead->next;
  39.   delete old;
  40.   return ret;
  41. }
  42. void
  43. SignalQueue::receive(void *me, NdbApiSignal *signal) {
  44.   SignalQueue *q = (SignalQueue *)me;
  45.   q->receive(signal);
  46. }
  47. void
  48. SignalQueue::receive(NdbApiSignal *signal) {
  49.   QueueEntry *n = new QueueEntry();
  50.   n->signal = signal;
  51.   n->next = NULL;
  52.   Guard guard(m_mutex);
  53.   if(m_signalQueueHead == NULL) {
  54.     m_signalQueueHead = n;
  55.     NdbCondition_Broadcast(m_cond);
  56.     return;
  57.   }
  58.   QueueEntry *cur = m_signalQueueHead;
  59.   while(cur->next != NULL)
  60.     cur = cur->next;
  61.   cur->next = n;
  62.   NdbCondition_Broadcast(m_cond);
  63. }
  64. NdbApiSignal *
  65. SignalQueue::waitFor(int gsn, NodeId nodeid, Uint32 timeout) {
  66.   Guard g(m_mutex);
  67.   if(m_signalQueueHead == NULL)
  68.     NdbCondition_WaitTimeout(m_cond, m_mutex, timeout);
  69.   if(m_signalQueueHead == NULL)
  70.     return NULL;
  71.   if(gsn != 0 && 
  72.      m_signalQueueHead->signal->readSignalNumber() != gsn)
  73.     return NULL;
  74.   if(nodeid != 0 &&
  75.      refToNode(m_signalQueueHead->signal->theSendersBlockRef) != nodeid)
  76.     return NULL;
  77.   return pop();
  78. }