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

模拟服务器

开发平台:

C/C++

  1. #include "zport.h"
  2. #include <stdio.h>
  3. #ifdef WIN32
  4. DWORD WINAPI ThreadProc(LPVOID lpParameter) {
  5. #else
  6. void *ThreadProc(LPVOID lpParameter) {
  7. #endif
  8.   ZThread *thread = (ZThread *)lpParameter;
  9.   thread->action();
  10.   return 0;
  11. }
  12. void ZThread::start() {
  13. #ifdef WIN32
  14.   handle = CreateThread(0, 0, ThreadProc, (LPVOID)this, 0, &id);
  15. #else
  16.   int ret = pthread_create(&p_thread, NULL, ThreadProc, this);
  17.   if (ret == 0)
  18.   {
  19.   pthread_detach(p_thread);
  20.   }
  21. #endif
  22. }
  23. void ZThread::stop() {
  24.   bStop = true;
  25. #ifdef WIN32
  26.   TerminateThread(handle, 0);
  27. #else
  28.   pthread_cancel(p_thread);
  29. #endif
  30. }
  31. namespace OnlineGameLib {
  32. namespace Win32 {
  33. CBuffer::CBuffer( Allocator &allocator, size_t size )
  34. : m_allocator( allocator )
  35. , m_ref( 1 )
  36. , m_size( size )
  37. , m_used( 0 )
  38. , m_packLength( 0 )
  39. , m_offsetNextPack( 0 )
  40. {
  41. //( ( BYTE * )( ( DWORD )( pMemory + 3 ) & ( ~3 ) ) )
  42. m_buffer_ptr = new BYTE[ size ];
  43. Empty();
  44. }
  45. CBuffer::~CBuffer()
  46. {
  47. SAFE_DELETE_ARRAY( m_buffer_ptr );
  48. }
  49. CBuffer *CBuffer::GetHeadPack( size_t packLength )
  50. {
  51. if ( 0 == m_used || 0 == packLength )
  52. {
  53. return NULL;
  54. }
  55. m_packLength = packLength;
  56. CBuffer *pNewBuffer = m_allocator.Allocate();
  57. size_t canused = ( m_packLength > m_used ) ? m_used : m_packLength;
  58. pNewBuffer->AddData( m_buffer_ptr, canused );
  59. m_offsetNextPack = canused;
  60. return pNewBuffer;
  61. }
  62. CBuffer *CBuffer::GetNextPack()
  63. {
  64. if ( m_offsetNextPack < m_used )
  65. {
  66. CBuffer *pNewBuffer = m_allocator.Allocate();
  67. size_t canused = ( m_offsetNextPack + m_packLength > m_used ) ? ( m_used - m_offsetNextPack ) : m_packLength;
  68. pNewBuffer->AddData( m_buffer_ptr + m_offsetNextPack, canused );
  69. m_offsetNextPack += canused;
  70. return pNewBuffer;
  71. }
  72. return NULL;
  73. }
  74. void CBuffer::AddData( const char * const pData, size_t dataLength )
  75. {
  76. if ( dataLength > m_size - m_used )
  77. {
  78. printf("CBuffer::AddData exception !!!n");
  79. return;
  80. }
  81. memcpy( m_buffer_ptr + m_used, pData, dataLength );
  82. m_used += dataLength;
  83. }
  84. void CBuffer::AddData( const BYTE * const pData, size_t dataLength )
  85. {
  86. AddData( reinterpret_cast< const char * >( pData ), dataLength );
  87. }
  88. void CBuffer::AddData( BYTE data )
  89. {
  90. AddData( &data, 1 );
  91. }
  92. CBuffer *CBuffer::SplitBuffer( size_t bytesToRemove )
  93. {
  94. CBuffer *pNewBuffer = m_allocator.Allocate();
  95. pNewBuffer->AddData( m_buffer_ptr, bytesToRemove );
  96. m_used -= bytesToRemove;
  97. memmove( m_buffer_ptr, m_buffer_ptr + bytesToRemove, m_used );
  98. return pNewBuffer;
  99. }
  100. CBuffer *CBuffer::AllocateNewBuffer() const
  101. {
  102. return m_allocator.Allocate();
  103. }
  104. void CBuffer::Release()
  105. {
  106. if ( m_ref == 0 )
  107. {
  108. printf("CBuffer::Release() Exception: m_ref is already zeron");
  109. return;
  110. }
  111. if ( 0 == (--m_ref) )
  112. {
  113. m_used = 0;
  114. m_allocator.Release( this );
  115. }
  116. }
  117. void *CBuffer::operator new( size_t objectSize, size_t /* bufferSize */ )
  118. {
  119. /*
  120.  * ASSERT( sizeof( DWORD ) == 4 );
  121.  *
  122.  * For four bytes aligned base on win32 system
  123.  */
  124. void *pMem = new char[ objectSize ]; //+ bufferSize + 4 ];
  125. return pMem;
  126. }
  127. void CBuffer::operator delete( void *pObject, size_t /* bufferSize */ )
  128. {
  129. SAFE_DELETE_ARRAY( pObject );
  130. }
  131. /*
  132.  * CBuffer::Allocator class
  133.  */
  134. CBuffer::Allocator::Allocator( size_t bufferSize, size_t maxFreeBuffers )
  135. : m_bufferSize( bufferSize )
  136. , m_maxFreeBuffers( maxFreeBuffers )
  137. {
  138. }
  139. CBuffer::Allocator::~Allocator()
  140. {
  141. try
  142. {
  143. Flush();
  144. }
  145. catch(...)
  146. {
  147. printf("CBuffer::Allocator::~Allocator exception!n");
  148. }
  149. }
  150. CBuffer *CBuffer::Allocator::Allocate()
  151. {
  152. // CCriticalSection::Owner lock( m_criticalSection );
  153. CBuffer *pBuffer = 0;
  154. if ( !m_freeList.Empty() )
  155. {
  156. pBuffer = m_freeList.PopNode();
  157. pBuffer->AddRef();
  158. }
  159. else
  160. {
  161. pBuffer = new( m_bufferSize )CBuffer( *this, m_bufferSize );
  162. if ( !pBuffer )
  163. {
  164. printf("CBuffer::Allocator::Allocate() Exception: Out of memoryn") ;
  165. return NULL;
  166. }
  167. OnBufferCreated();
  168. }
  169. m_activeList.PushNode( pBuffer );
  170. OnBufferAllocated();
  171. return pBuffer;
  172. }
  173. void CBuffer::Allocator::Flush()
  174. {
  175. // CCriticalSection::Owner lock( m_criticalSection );
  176. while ( !m_activeList.Empty() )
  177. {
  178. OnBufferReleased();
  179. DestroyBuffer( m_activeList.PopNode() );
  180. }
  181. while ( !m_freeList.Empty() )
  182. {
  183. DestroyBuffer( m_freeList.PopNode() );
  184. }
  185. }
  186. void CBuffer::Allocator::Release( CBuffer *pBuffer )
  187. {
  188. if ( !pBuffer )
  189. {
  190. printf("CBuffer::Allocator::Release() Exception: pBuffer is nulln");
  191. return;
  192. }
  193. // CCriticalSection::Owner lock( m_criticalSection );
  194. OnBufferReleased();
  195. /*
  196.  * unlink from the in use list
  197.  */
  198. pBuffer->RemoveFromList();
  199. if ( m_maxFreeBuffers == 0 || m_freeList.Count() < m_maxFreeBuffers )
  200. {
  201. pBuffer->Empty();           
  202. /*
  203.  * add to the free list
  204.  */
  205. m_freeList.PushNode( pBuffer );
  206. }
  207. else
  208. {
  209. DestroyBuffer( pBuffer );
  210. }
  211. }
  212. } // End of namespace OnlineGameLib
  213. } // End of namespace Win32
  214. namespace OnlineGameLib {
  215. /*
  216.  * CNodeList
  217.  */
  218. CNodeList::CNodeList()
  219. : m_pHead( 0 ),
  220. m_numNodes( 0 ) 
  221. {
  222. }
  223. void CNodeList::PushNode( Node *pNode )
  224. {
  225. ASSERT( pNode );
  226. pNode->AddToList( this );
  227. pNode->Next( m_pHead );
  228. m_pHead = pNode;
  229. ++ m_numNodes;
  230. }
  231. CNodeList::Node *CNodeList::PopNode()
  232. {
  233. Node *pNode = m_pHead;
  234. if ( pNode )
  235. {
  236. RemoveNode( pNode );
  237. }
  238. return pNode;
  239. }
  240. void CNodeList::RemoveNode( Node *pNode )
  241. {
  242. ASSERT( pNode );
  243. if ( pNode == m_pHead )
  244. {
  245. m_pHead = pNode->Next();
  246. }
  247. pNode->Unlink();
  248. -- m_numNodes;
  249. }
  250. /*
  251.  * CNodeList::Node
  252.  */
  253. CNodeList::Node::Node() 
  254. : m_pNext( 0 ),
  255. m_pPrev( 0 ),
  256. m_pList( 0 ) 
  257. {
  258. }
  259. CNodeList::Node::~Node() 
  260. {
  261. try
  262. {
  263. RemoveFromList();   
  264. }
  265. catch( ... )
  266. {
  267. TRACE( "CNodeList::Node::~Node() exception!" );
  268. }
  269. m_pNext = 0;
  270. m_pPrev = 0;
  271. m_pList = 0;
  272. }
  273. void CNodeList::Node::AddToList( CNodeList *pList )
  274. {
  275. m_pList = pList;
  276. }
  277. void CNodeList::Node::RemoveFromList()
  278. {
  279. if ( m_pList )
  280. {
  281. m_pList->RemoveNode( this );
  282. }
  283. }
  284. void CNodeList::Node::Unlink()
  285. {
  286. if ( m_pPrev )
  287. {
  288. m_pPrev->m_pNext = m_pNext;
  289. }
  290. if ( m_pNext )
  291. {
  292. m_pNext->m_pPrev = m_pPrev;
  293. }
  294.    
  295. m_pNext = 0;
  296. m_pPrev = 0;
  297. m_pList = 0;
  298. }
  299. } // End of namespace OnlineGameLib