⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sendbuffer.hpp

📁 mysql-5.0.22.tar.gz源码包
💻 HPP
字号:
/* 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 *///****************************************************************************////  NAME//      SendBuffer////  DESCRIPTION//      The SendBuffer is a circular buffer storing signals waiting to be sent.//      The signals can be of variable size and are copied into the buffer //      in Protocol 6 format. There will be two SendBuffer instances //      (priority level A and B) for each transporter using a buffer for //      sending. The buffering will in most cases be done to send as big //      packages as possible over TCP/IP.////***************************************************************************/#ifndef SendBuffer_H#define SendBuffer_H#include "TransporterDefinitions.hpp"#include <TransporterCallback.hpp>#ifdef DEBUG_TRANSPORTER#include <ndb_global.h>#endifclass SendBuffer {  friend class TCP_Transporter;public:  // Set member variables  SendBuffer(Uint32 bufSize);  // Deallocate the buffer memory  ~SendBuffer();    // Allocate memory for the buffer and initialize the buffer pointers  bool initBuffer(Uint32 aRemoteNodeId);    // Number of bytes remaining in the buffer  Uint32 bufferSizeRemaining() const;  // Number of bytes of data in the buffer   int bufferSize();   // Empty the buffer  void emptyBuffer();    /**   * The transporter calls updateBuffer after a retrieve followed by    * a successful send, to update the cirkular buffer pointers.   * updateBuffer is called with the number of bytes really sent,   * it may be that it is less than what was retrived from the buffer.   * If that is the case there will be an incomplete message (slack)   * in the SendBuffer.    *   * Returns  0 if buffer empty   *    else ~0   */  Uint32 bytesSent(Uint32 len);  #ifdef DEBUG_TRANSPORTER  // Prints the buffer status on the screen. Can be used for testing purposes.  void print();#endif  Uint32* getInsertPtr(Uint32 bytes);  void updateInsertPtr(Uint32 bytes);private:    Uint32   sizeOfBuffer;  // Length, in number of bytes, of the buffer memory  Uint32   dataSize;      // Number of bytes in buffer    Uint32 * startOfBuffer; // Pointer to the start of the buffer memory  Uint32 * endOfBuffer;   // Pointer to end of buffer    Uint32 * insertPtr;     // Where to insert next    char *   sendPtr;           // Where data to send starts  Uint32   sendDataSize;      // Num bytes to send    Uint32   theRemoteNodeId;};inlineUint32SendBuffer::bytesSent(Uint32 bytes) {  if(bytes > dataSize){#ifdef DEBUG_TRANSPORTER    printf("bytes(%d) > dataSize(%d)\n", bytes, dataSize);#endif    abort();    // reportError(0 ,theRemoteNodeId, TE_INVALID_MESSAGE_LENGTH);    return 0;  }//if  if(bytes > sendDataSize){#ifdef DEBUG_TRANSPORTER    printf("bytes(%d) > sendDataSize(%d)\n", bytes, sendDataSize);#endif    abort();    //reportError(0,theRemoteNodeId, TE_INVALID_MESSAGE_LENGTH);    return 0;  }//if  dataSize     -= bytes;  sendPtr      += bytes;  sendDataSize -= bytes;    if(sendDataSize == 0){    if(sendPtr > (char*)insertPtr){      sendPtr = (char *)startOfBuffer;      sendDataSize = dataSize;    } else {      sendPtr = ((char*)insertPtr) - dataSize;      sendDataSize = dataSize;    }  }    if(dataSize == 0)    return 0;  return ~0;}inlineUint32*SendBuffer::getInsertPtr(Uint32 len){  if (bufferSizeRemaining() < len){    return 0;  }  const char * const tmpInsertPtr = (char *) insertPtr;  if(tmpInsertPtr >= sendPtr){    // Is there enough space at the end of the buffer?     if ((tmpInsertPtr + len) < (char*)endOfBuffer){      sendDataSize += len;      return insertPtr;    } else {      // We have passed the end of the cirkular buffer,       // must start from the beginning      // Is there enough space in the beginning of the buffer?      if ((Uint32)(sendPtr - (char *)startOfBuffer) <= len){	// Not enough space available, insert failed	return 0;      } else {	// There is space available at the beginning of the buffer	// We start from the beginning, set endOfData and insertPtr	insertPtr = startOfBuffer; 	if(sendDataSize != 0){	  return insertPtr;	}		sendPtr      = (char *)startOfBuffer;	sendDataSize = len;	return insertPtr;      }    }  } else {    // sendPtr > insertPtr    // Is there enought room    if((tmpInsertPtr + len) < sendPtr){      return insertPtr;    }    return 0;  }}inlinevoidSendBuffer::updateInsertPtr(Uint32 lenBytes){  dataSize  += lenBytes;  insertPtr += (lenBytes / 4);}#endif // Define of SendBuffer_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -