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

模拟服务器

开发平台:

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. #ifndef _WINDOWS_
  14. #define WIN32_LEAN_AND_MEAN
  15. #include <windows.h>
  16. #undef WIN32_LEAN_AND_MEAN
  17. #endif
  18. /*
  19.  * Identifier was truncated to '255' characters 
  20.  * in the debug information
  21.  */
  22. #pragma warning(disable : 4786)                               
  23. #include <winsock2.h>
  24. #include "CriticalSection.h" 
  25. #include "tstring.h"
  26. #include "NodeList.h"
  27. #include "OpaqueUserData.h"
  28. #include "Macro.h"
  29. #include <map>
  30. /*
  31.  * Nonstandard extension used : zero-sized array in struct/union
  32.  */
  33. #pragma warning(disable: 4200)
  34. /*
  35.  * namespace OnlineGameLib::Win32
  36.  */
  37. namespace OnlineGameLib {
  38. namespace Win32 {
  39. /*
  40.  * CIOBuffer
  41.  */
  42. class CIOBuffer : 
  43. public OVERLAPPED, 
  44. public CNodeList::Node, 
  45. public COpaqueUserData
  46. {
  47. public:
  48. class Allocator;
  49. friend class Allocator;
  50. class InOrderBufferList;
  51. WSABUF *GetWSABUF() const { return const_cast< WSABUF * >( &m_wsabuf ); };
  52. size_t GetUsed() const { return m_used; };
  53. size_t GetSize() const { return m_size; };
  54. const BYTE *GetBuffer() const { return m_buffer_ptr; };
  55. void SetupZeroByteRead();
  56. void SetupRead();
  57. void SetupWrite();
  58. void AddData( const char * const pData, size_t dataLength );
  59. void AddData( const BYTE * const pData, size_t dataLength );
  60. void AddData( BYTE data );
  61. void Use( size_t dataUsed ) { m_used += dataUsed; };
  62. CIOBuffer *SplitBuffer( size_t bytesToRemove );
  63. void RemoveBuffer( size_t bytesToRemove );
  64. CIOBuffer *AllocateNewBuffer() const;
  65. void ConsumeAndRemove( size_t bytesToRemove );
  66. void Empty();
  67. void AddRef() { ::InterlockedIncrement( &m_ref ); };
  68. void Release();
  69. size_t GetOperation() const { return m_operation; };
  70. void SetOperation( size_t operation ) { m_operation = operation; };
  71. size_t GetSequenceNumber() const { return m_sequenceNumber; };
  72. void SetSequenceNumber( size_t sequenceNumber ) { m_sequenceNumber = sequenceNumber; };
  73. private:
  74. size_t m_operation;
  75. size_t m_sequenceNumber;
  76. WSABUF m_wsabuf;
  77. Allocator &m_allocator;
  78. long m_ref;
  79. const size_t m_size;
  80. size_t m_used;
  81. /*
  82.  * Start of the actual buffer, must remain the last
  83.  * data member in the class.
  84.  */
  85. BYTE *m_buffer_ptr; // four bytes aligned
  86. //BYTE m_buffer_base_addr[0];
  87. private:
  88. static void *operator new( size_t objSize, size_t bufferSize );
  89. static void operator delete( void *pObj, size_t bufferSize );
  90. CIOBuffer( Allocator &m_allocator, size_t size );
  91. ~CIOBuffer();
  92. /*
  93.      * No copies do not implement
  94.      */
  95. CIOBuffer( const CIOBuffer &rhs );
  96. CIOBuffer &operator=( const CIOBuffer &rhs );
  97. };
  98. /*
  99.  * CIOBuffer::Allocator
  100.  */
  101. class CIOBuffer::Allocator
  102. {
  103. public:
  104.       friend class CIOBuffer;
  105.       explicit Allocator( size_t bufferSize, size_t maxFreeBuffers );
  106.       virtual ~Allocator();
  107.       CIOBuffer *Allocate();
  108.       size_t GetBufferSize() const { return m_bufferSize; };
  109. protected:
  110.       void Flush();
  111. private:
  112.       void Release( CIOBuffer *pBuffer );
  113.       virtual void OnBufferCreated() {}
  114.       virtual void OnBufferAllocated() {}
  115.       virtual void OnBufferReleased() {}
  116.       void DestroyBuffer( CIOBuffer *pBuffer );
  117.       const size_t m_bufferSize;
  118.       typedef TNodeList< CIOBuffer > BufferList;
  119.       
  120.       BufferList m_freeList;
  121.       BufferList m_activeList;
  122.       
  123.       const size_t m_maxFreeBuffers;
  124.       CCriticalSection m_criticalSection;
  125.       /*
  126.    * No copies do not implement
  127.    */
  128.       Allocator( const Allocator &rhs );
  129.       Allocator &operator=( const Allocator &rhs );
  130. };
  131. /*
  132.  * CIOBuffer::InOrderBufferList
  133.  */
  134. class CIOBuffer::InOrderBufferList
  135. {
  136. public:
  137.       explicit InOrderBufferList( CCriticalSection &lock );
  138.       void AddBuffer( CIOBuffer *pBuffer );
  139.       void ProcessBuffer();
  140.       CIOBuffer *ProcessAndGetNext();
  141.       CIOBuffer *GetNext();
  142.       CIOBuffer *GetNext( CIOBuffer *pBuffer );
  143.       void Reset();
  144.       bool Empty() const { return m_list.empty(); };
  145. private:
  146.       size_t m_next;
  147.    
  148.       typedef std::map< size_t, CIOBuffer * > BufferSequence;
  149.       BufferSequence m_list;
  150.       CCriticalSection &m_criticalSection;
  151. };
  152. inline void CIOBuffer::ConsumeAndRemove( size_t bytesToRemove )
  153. {
  154. m_used -= bytesToRemove;
  155. memmove( m_buffer_ptr, m_buffer_ptr + bytesToRemove, m_used );
  156. }
  157. inline void CIOBuffer::SetupZeroByteRead()
  158. {
  159. m_wsabuf.buf = reinterpret_cast< char * >( m_buffer_ptr );
  160. m_wsabuf.len = 0; 
  161. }
  162. inline void CIOBuffer::SetupRead()
  163. {
  164. if ( m_used == 0 )
  165. {
  166. m_wsabuf.buf = reinterpret_cast< char * >( m_buffer_ptr );
  167. m_wsabuf.len = m_size; 
  168. }
  169. else
  170. {
  171. m_wsabuf.buf = reinterpret_cast< char * >( m_buffer_ptr ) + m_used;
  172. m_wsabuf.len = m_size - m_used;
  173.    }
  174. }
  175. inline void CIOBuffer::SetupWrite()
  176. {
  177. m_wsabuf.buf = reinterpret_cast< char * >( m_buffer_ptr );
  178. m_wsabuf.len = m_used;
  179. m_used = 0;
  180. }
  181. } // End of namespace OnlineGameLib
  182. } // End of namespace Win32
  183. #endif //__INCLUDE_IOBUFFER_H__