SHM_Transporter.hpp 3.77 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
/* Copyright (C) 2003 MySQL AB

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

#ifndef SHM_Transporter_H
#define SHM_Transporter_H

#include "Transporter.hpp"
#include "SHM_Buffer.hpp"

#ifdef NDB_WIN32
typedef Uint32 key_t;
#endif

/** 
 * class SHMTransporter
 * @brief - main class for the SHM transporter.
 */

class SHM_Transporter : public Transporter {
  friend class TransporterRegistry;
public:
35 36 37 38 39
  SHM_Transporter(TransporterRegistry &,
		  const char *lHostName,
		  const char *rHostName, 
		  int r_port,
		  NodeId lNodeId,
40 41
		  NodeId rNodeId, 
		  bool checksum, 
42 43 44
		  bool signalId,
		  key_t shmKey,
		  Uint32 shmSize);
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
  
  /**
   * SHM destructor
   */
  virtual ~SHM_Transporter();

  /**
   * Do initialization
   */
  bool initTransporter();
      
  Uint32 * getWritePtr(Uint32 lenBytes, Uint32 prio){
    return (Uint32 *)writer->getWritePtr(lenBytes);
  }
  
  void updateWritePtr(Uint32 lenBytes, Uint32 prio){
    writer->updateWritePtr(lenBytes);
  }
  
mikael@mc04.(none)'s avatar
mikael@mc04.(none) committed
64 65
  void getReceivePtr(Uint32 ** ptr, Uint32 sz){
    sz = reader->getReadPtr(* ptr);
66 67
  }
  
mikael@mc04.(none)'s avatar
mikael@mc04.(none) committed
68 69
  void updateReceivePtr(Uint32 sz){
    reader->updateReadPtr(sz);
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
  }
  
protected:
  /**
   * disconnect a segmnet
   * -# deletes the shm buffer associated with a segment
   * -# marks the segment for removal
   */
  void disconnectImpl();

  /**
   * Blocking
   *
   * -# Create shm segment
   * -# Attach to it
   * -# Wait for someone to attach (max wait = timeout), then rerun again
   *    until connection established.
   * @param timeOutMillis - the time to sleep before (ms) trying again.
   * @returns - True if the server managed to hook up with the client,
   *            i.e., both agrees that the other one has setup the segment.
   *            Otherwise false.
   */
92
  virtual bool connect_server_impl(NDB_SOCKET_TYPE sockfd);
93 94 95 96 97 98 99 100 101 102 103 104 105

  /**
   * Blocking
   *
   * -# Attach to shm segment
   * -# Check if the segment is setup
   * -# Check if the server set it up
   * -# If all clear, return.
   * @param timeOutMillis - the time to sleep before (ms) trying again.
   * @returns - True if the client managed to hook up with the server,
   *            i.e., both agrees that the other one has setup the segment.
   *            Otherwise false.
   */
106 107 108
  virtual bool connect_client_impl(NDB_SOCKET_TYPE sockfd);

  bool connect_common(NDB_SOCKET_TYPE sockfd);
109

110 111 112
  bool ndb_shm_create();
  bool ndb_shm_get();
  bool ndb_shm_attach();
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128

  /**
   * Check if there are two processes attached to the segment (a connection)
   * @return - True if the above holds. Otherwise false.
   */
  bool checkConnected();

  
  /**
   * Initialises the SHM_Reader and SHM_Writer on the segment 
   */
  void setupBuffers();

private:
  bool _shmSegCreated;
  bool _attached;
mikael@mc04.(none)'s avatar
mikael@mc04.(none) committed
129
  bool m_connected;
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
    
  key_t shmKey;
  volatile Uint32 * serverStatusFlag;
  volatile Uint32 * clientStatusFlag;  
  bool setupBuffersDone;

#ifdef NDB_WIN32
  HANDLE hFileMapping;
#else
  int shmId;
#endif

  int shmSize;
  char * shmBuf;

  SHM_Reader * reader;
  SHM_Writer * writer;

  /**
   * @return - True if the reader has data to read on its segment.
   */
  bool hasDataToRead() const {
    return reader->empty() == false;
  }
};

#endif