diff options
Diffstat (limited to 'storage/ndb/src/common/transporter/SHM_Transporter.hpp')
-rw-r--r-- | storage/ndb/src/common/transporter/SHM_Transporter.hpp | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/storage/ndb/src/common/transporter/SHM_Transporter.hpp b/storage/ndb/src/common/transporter/SHM_Transporter.hpp new file mode 100644 index 00000000000..677bd6efc37 --- /dev/null +++ b/storage/ndb/src/common/transporter/SHM_Transporter.hpp @@ -0,0 +1,173 @@ +/* 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: + SHM_Transporter(TransporterRegistry &, + const char *lHostName, + const char *rHostName, + int r_port, + bool isMgmConnection, + NodeId lNodeId, + NodeId rNodeId, + NodeId serverNodeId, + bool checksum, + bool signalId, + key_t shmKey, + Uint32 shmSize); + + /** + * 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); + m_last_signal += lenBytes; + if(m_last_signal >= m_signal_threshold) + { + doSend(); + } + } + + void getReceivePtr(Uint32 ** ptr, Uint32 ** eod){ + reader->getReadPtr(* ptr, * eod); + } + + void updateReceivePtr(Uint32 * ptr){ + reader->updateReadPtr(ptr); + } + +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. + */ + virtual bool connect_server_impl(NDB_SOCKET_TYPE sockfd); + + /** + * 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. + */ + virtual bool connect_client_impl(NDB_SOCKET_TYPE sockfd); + + bool connect_common(NDB_SOCKET_TYPE sockfd); + + bool ndb_shm_create(); + bool ndb_shm_get(); + bool ndb_shm_attach(); + + /** + * 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(); + + /** + * doSend (i.e signal receiver) + */ + void doSend(); + int m_remote_pid; + Uint32 m_last_signal; + Uint32 m_signal_threshold; + +private: + bool _shmSegCreated; + bool _attached; + bool m_connected; + + 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 |