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