SHM_Transporter.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 SHM_Transporter_H
  14. #define SHM_Transporter_H
  15. #include "Transporter.hpp"
  16. #include "SHM_Buffer.hpp"
  17. #ifdef NDB_WIN32
  18. typedef Uint32 key_t;
  19. #endif
  20. /** 
  21.  * class SHMTransporter
  22.  * @brief - main class for the SHM transporter.
  23.  */
  24. class SHM_Transporter : public Transporter {
  25.   friend class TransporterRegistry;
  26. public:
  27.   SHM_Transporter(TransporterRegistry &,
  28.   const char *lHostName,
  29.   const char *rHostName, 
  30.   int r_port,
  31.   NodeId lNodeId,
  32.   NodeId rNodeId, 
  33.   bool checksum, 
  34.   bool signalId,
  35.   key_t shmKey,
  36.   Uint32 shmSize);
  37.   
  38.   /**
  39.    * SHM destructor
  40.    */
  41.   virtual ~SHM_Transporter();
  42.   
  43.   /**
  44.    * Do initialization
  45.    */
  46.   bool initTransporter();
  47.   
  48.   Uint32 * getWritePtr(Uint32 lenBytes, Uint32 prio)
  49.   {
  50.     return (Uint32 *)writer->getWritePtr(lenBytes);
  51.   }
  52.   
  53.   void updateWritePtr(Uint32 lenBytes, Uint32 prio)
  54.   {
  55.     writer->updateWritePtr(lenBytes);
  56.     m_last_signal += lenBytes;
  57.     if(m_last_signal >= m_signal_threshold)
  58.     {
  59.       doSend();
  60.     }
  61.   }
  62.   
  63.   void getReceivePtr(Uint32 ** ptr, Uint32 ** eod){
  64.     reader->getReadPtr(* ptr, * eod);
  65.   }
  66.   
  67.   void updateReceivePtr(Uint32 * ptr){
  68.     reader->updateReadPtr(ptr);
  69.   }
  70.   
  71. protected:
  72.   /**
  73.    * disconnect a segmnet
  74.    * -# deletes the shm buffer associated with a segment
  75.    * -# marks the segment for removal
  76.    */
  77.   void disconnectImpl();
  78.   /**
  79.    * Blocking
  80.    *
  81.    * -# Create shm segment
  82.    * -# Attach to it
  83.    * -# Wait for someone to attach (max wait = timeout), then rerun again
  84.    *    until connection established.
  85.    * @param timeOutMillis - the time to sleep before (ms) trying again.
  86.    * @returns - True if the server managed to hook up with the client,
  87.    *            i.e., both agrees that the other one has setup the segment.
  88.    *            Otherwise false.
  89.    */
  90.   virtual bool connect_server_impl(NDB_SOCKET_TYPE sockfd);
  91.   /**
  92.    * Blocking
  93.    *
  94.    * -# Attach to shm segment
  95.    * -# Check if the segment is setup
  96.    * -# Check if the server set it up
  97.    * -# If all clear, return.
  98.    * @param timeOutMillis - the time to sleep before (ms) trying again.
  99.    * @returns - True if the client managed to hook up with the server,
  100.    *            i.e., both agrees that the other one has setup the segment.
  101.    *            Otherwise false.
  102.    */
  103.   virtual bool connect_client_impl(NDB_SOCKET_TYPE sockfd);
  104.   bool connect_common(NDB_SOCKET_TYPE sockfd);
  105.   bool ndb_shm_create();
  106.   bool ndb_shm_get();
  107.   bool ndb_shm_attach();
  108.   /**
  109.    * Check if there are two processes attached to the segment (a connection)
  110.    * @return - True if the above holds. Otherwise false.
  111.    */
  112.   bool checkConnected();
  113.   
  114.   /**
  115.    * Initialises the SHM_Reader and SHM_Writer on the segment 
  116.    */
  117.   void setupBuffers();
  118.   /**
  119.    * doSend (i.e signal receiver)
  120.    */
  121.   void doSend();
  122.   int m_remote_pid;
  123.   Uint32 m_last_signal;
  124.   Uint32 m_signal_threshold;
  125.   virtual Uint32 get_free_buffer() const;
  126.   
  127. private:
  128.   bool _shmSegCreated;
  129.   bool _attached;
  130.   bool m_connected;
  131.   
  132.   key_t shmKey;
  133.   volatile Uint32 * serverStatusFlag;
  134.   volatile Uint32 * clientStatusFlag;  
  135.   bool setupBuffersDone;
  136.   
  137. #ifdef NDB_WIN32
  138.   HANDLE hFileMapping;
  139. #else
  140.   int shmId;
  141. #endif
  142.   
  143.   int shmSize;
  144.   char * shmBuf;
  145.   
  146.   SHM_Reader * reader;
  147.   SHM_Writer * writer;
  148.   
  149.   /**
  150.    * @return - True if the reader has data to read on its segment.
  151.    */
  152.   bool hasDataToRead() const {
  153.     return reader->empty() == false;
  154.   }
  155. };
  156. #endif