MemoryChannelOSE.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:4k
源码类别:

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. #ifndef MemoryChannelOSE_H
  14. #define MemoryChannelOSE_H
  15. //===========================================================================
  16. //
  17. // .DESCRIPTION
  18. //              Pointer based communication channel for communication between two 
  19. //              thread. It sends the pointer to the other signal via an OSE signal 
  20. //
  21. // .TYPICAL USE:
  22. //              to communicate between threads.
  23. //
  24. // .EXAMPLE:
  25. //              See AsyncFile.C
  26. //===========================================================================
  27. //
  28. //
  29. // MemoryChannel( int size= 256);
  30. //   Constuctor
  31. // Parameters:
  32. //      size : is ignored in OSE version
  33. //
  34. // void operator ++ ();
  35. //   increments the index with one, if size is reached it is set to zero
  36. //
  37. // virtual void write( T *t);
  38. //   Puts the item in the channel if the channel is full an error is reported.
  39. // Parameters:
  40. //      t: pointer to item to put in the channel, after this the item
  41. //                        is shared with the other thread.
  42. // errors
  43. //                      AFS_ERROR_CHANNALFULL, channel is full
  44. //
  45. // T* read();
  46. //      Reads a itemn from the channel, if channel is empty it blocks untill
  47. //              an item can be read.
  48. // return
  49. //                      T : item from the channel
  50. //
  51. // T* tryRead();
  52. //      Reads a item from the channel, if channel is empty it returns zero.
  53. // return
  54. //                      T : item from the channel or zero if channel is empty.
  55. //
  56. #include <ose.h>
  57. #include "ErrorHandlingMacros.hpp"
  58. #include "Error.hpp"
  59. #include "NdbMutex.h"
  60. #include "NdbCondition.h"
  61. template <class T>
  62. class MemoryChannel
  63. {
  64. public:
  65.   MemoryChannel( int size= 256);
  66.   virtual ~MemoryChannel( );
  67.   virtual void writeChannel( T *t);
  68.   T* readChannel();
  69.   T* tryReadChannel();
  70. private:
  71.   PROCESS theReceiverPid;
  72. };
  73. template <class T> class MemoryChannelMultipleWriter:public MemoryChannel<T>
  74. {
  75. public:
  76.   MemoryChannelMultipleWriter( int size= 256);
  77.   ~MemoryChannelMultipleWriter( );
  78.   void writeChannel( T *t);
  79. private:
  80. };
  81. #define MEMCHANNEL_SIGBASE  5643
  82.    
  83. #define MEMCHANNEL_SIGNAL           (MEMCHANNEL_SIGBASE + 1)  /* !-SIGNO(struct MemChannelSignal)-! */  
  84. struct MemChannelSignal
  85. {
  86.   SIGSELECT sigNo;
  87.   void* ptr;
  88. };
  89. union SIGNAL 
  90. {
  91.   SIGSELECT sigNo;
  92.   struct MemChannelSignal          memChanSig;
  93. };
  94. template <class T> MemoryChannel<T>::MemoryChannel( int size )
  95. {
  96.   // Default receiver for this channel is the creating process
  97.   theReceiverPid = current_process();
  98. }
  99. template <class T> MemoryChannel<T>::~MemoryChannel( )
  100. {
  101. }
  102. template <class T> void MemoryChannel<T>::writeChannel( T *t)
  103. {
  104.   union SIGNAL* sig;
  105.   sig = alloc(sizeof(struct MemChannelSignal), MEMCHANNEL_SIGNAL);
  106.   ((struct MemChannelSignal*)sig)->ptr = t;
  107.   send(&sig, theReceiverPid);
  108. }
  109. template <class T> T* MemoryChannel<T>::readChannel()
  110. {
  111.   T* tmp;
  112.   static const SIGSELECT sel_mem[] = {1, MEMCHANNEL_SIGNAL};
  113.   union SIGNAL* sig;
  114.   tmp = NULL; /* Default value */
  115.   sig = receive((SIGSELECT*)sel_mem);
  116.   if (sig != NIL){
  117.     if (sig->sigNo == MEMCHANNEL_SIGNAL){
  118.       tmp = (T*)(((struct MemChannelSignal*)sig)->ptr);
  119.     }else{
  120.       assert(1==0);
  121.     }
  122.     free_buf(&sig);    
  123.   }
  124.   return tmp;
  125. }
  126. template <class T> T* MemoryChannel<T>::tryReadChannel()
  127. {
  128.   T* tmp;
  129.   static const SIGSELECT sel_mem[] = {1, MEMCHANNEL_SIGNAL};
  130.   union SIGNAL* sig;
  131.   tmp = NULL; /* Default value */
  132.   sig = receive_w_tmo(0, (SIGSELECT*)sel_mem);
  133.   if (sig != NIL){
  134.     if (sig->sigNo == MEMCHANNEL_SIGNAL){
  135.       tmp = (T*)(((struct MemChannelSignal*)sig)->ptr);
  136.     }else{
  137.       assert(1==0);
  138.     }
  139.     free_buf(&sig);    
  140.   }
  141.   return tmp;
  142. }
  143. #endif // MemoryChannel_H