IOBuffer.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:3k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /********************************************************************
  2. created: 2003/02/14
  3. file base: IOBuffer
  4. file ext: h
  5. author: liupeng
  6. purpose: Header file for CIOBuffer class
  7. *********************************************************************/
  8. #ifndef __INCLUDE_IOBUFFER_H__
  9. #define __INCLUDE_IOBUFFER_H__
  10. #if defined (_MSC_VER) && (_MSC_VER >= 1020)
  11. #pragma once
  12. #endif
  13. #include <winsock2.h>
  14. #include "CriticalSection.h" 
  15. #include "tstring.h"
  16. #include "NodeList.h"
  17. #include "OpaqueUserData.h"
  18. /*
  19.  * Nonstandard extension used : zero-sized array in struct/union
  20.  */
  21. #pragma warning(disable: 4200)
  22. /*
  23.  * namespace OnlineGameLib::Win32
  24.  */
  25. namespace OnlineGameLib {
  26. namespace Win32 {
  27. /*
  28.  * CIOBuffer
  29.  */
  30. class CIOBuffer : public OVERLAPPED, public CNodeList::Node, public COpaqueUserData
  31. {
  32. public :
  33. class Allocator;
  34. friend class Allocator;
  35. WSABUF *GetWSABUF() const;
  36. size_t GetUsed() const;
  37. size_t GetSize() const;
  38. const BYTE *GetBuffer() const;
  39. void SetupRead();
  40. void SetupWrite();
  41. void AddData( const char * const pData, size_t dataLength );
  42. void AddData( const BYTE * const pData, size_t dataLength );
  43. void AddData( BYTE data );
  44. void Use( size_t dataUsed );
  45. CIOBuffer *SplitBuffer( size_t bytesToRemove );
  46. CIOBuffer *AllocateNewBuffer() const;
  47. void ConsumeAndRemove( size_t bytesToRemove );
  48. void Empty();
  49. void AddRef();
  50. void Release();
  51. size_t GetOperation() const;
  52. void SetOperation( size_t operation );
  53. private :
  54. /*
  55.  * Data member in the class
  56.  */
  57. size_t m_operation;
  58. WSABUF m_wsabuf;
  59. Allocator &m_allocator;
  60. long m_ref;
  61. const size_t m_size;
  62. size_t m_used;
  63. /*
  64.  * Start of the actual buffer, must remain the last
  65.  */
  66. BYTE m_buffer[0];
  67. private :
  68. static void *operator new( size_t objSize, size_t bufferSize );
  69. static void operator delete( void *pObj, size_t bufferSize );
  70. CIOBuffer( Allocator &m_allocator, size_t size );
  71. /*
  72.  * No copies do not implement
  73.  */
  74. CIOBuffer( const CIOBuffer &rhs );
  75. CIOBuffer &operator=( const CIOBuffer &rhs );
  76. };
  77. /*
  78.  * CIOBuffer::Allocator
  79.  */
  80. class CIOBuffer::Allocator
  81. {
  82. public :
  83. friend class CIOBuffer;
  84. explicit Allocator( size_t bufferSize, size_t maxFreeBuffers );
  85. virtual ~Allocator();
  86. CIOBuffer *Allocate();
  87. protected :
  88. void Flush();
  89. private :
  90. void Release( CIOBuffer *pBuffer );
  91. virtual void OnBufferCreated() {}
  92. virtual void OnBufferAllocated() {}
  93. virtual void OnBufferReleased() {}
  94. virtual void OnBufferDestroyed() {}
  95. void DestroyBuffer( CIOBuffer *pBuffer );
  96. const size_t m_bufferSize;
  97. typedef TNodeList<CIOBuffer> BufferList;
  98. BufferList m_freeList;
  99. BufferList m_activeList;
  100. const size_t m_maxFreeBuffers;
  101. CCriticalSection m_criticalSection;
  102. /*
  103.  * No copies do not implement
  104.  */
  105. Allocator( const Allocator &rhs );
  106. Allocator &operator=( const Allocator &rhs );
  107. };
  108. } // End of namespace OnlineGameLib
  109. } // End of namespace Win32
  110. #endif //__INCLUDE_IOBUFFER_H__