List.cpp
上传用户:tt_chan
上传日期:2009-12-03
资源大小:4523k
文件大小:4k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. // **************************************************************************************
  2. //
  3. //  Euyheon's Linked List Class
  4. //
  5. //  All written by Euy-heon, Jeong.
  6. //  Copyright(C) 1999-2001 Euy-heon, Jeong. All rights reserved.
  7. //
  8. // Win32 Version : Compiled by Microsoft Visual C++ 6.0
  9. //
  10. // Problems & History
  11. // ------------------
  12. //
  13. // **************************************************************************************
  14. #include "stdafx.h"
  15. template<class T> CWHList<T>::CWHList()
  16. {   
  17. m_lpHead = NULL;
  18. m_lpTail = NULL;
  19. m_nCount = 0;
  20. InitializeCriticalSection(&m_cs);
  21. }
  22. template<class T> CWHList<T>::~CWHList()
  23. {
  24. Clear();
  25. DeleteCriticalSection(&m_cs);
  26. }
  27. template<class T> BOOL CWHList<T>::AddNewNode(T lpData)
  28. {
  29. BOOL fRet = FALSE;
  30. EnterCriticalSection(&m_cs);
  31. __try
  32. {
  33. LPLINKEDLIST lpCD = (LPLINKEDLIST)GlobalAlloc(GPTR, sizeof(LINKEDLIST));
  34. lpCD->lpData = lpData;
  35. if (!m_lpHead)
  36. {
  37. m_lpHead = lpCD;
  38. lpCD->prev = (LPLINKEDLIST)NULL;
  39. }
  40. else
  41. {
  42. m_lpTail->next = lpCD;
  43. lpCD->prev = m_lpTail;
  44. }
  45. lpCD->next = (LPLINKEDLIST)NULL;
  46. m_lpTail = lpCD;
  47. m_nCount++;
  48. fRet = TRUE;
  49. }
  50. __finally
  51. {
  52. LeaveCriticalSection(&m_cs);
  53. }
  54. return fRet;
  55. }
  56. template<class T> void CWHList<T>::Clear()
  57. {
  58. EnterCriticalSection(&m_cs);
  59. LPLINKEDLIST lpNode = m_lpHead;
  60. __try
  61. {
  62. while (lpNode)
  63. lpNode = RemoveNode(lpNode);
  64. }
  65. __finally
  66. {
  67. LeaveCriticalSection(&m_cs);
  68. }
  69. }
  70. /*template<class T> LPLINKEDLIST CWHList<T>::RemoveNode(LPLINKEDLIST lpList)
  71. {
  72.     LPLINKEDLIST prev = NULL, next;
  73. EnterCriticalSection(&m_cs);
  74. __try
  75. {
  76. next = lpList->next;
  77. prev = lpList->prev;
  78. if (prev) prev->next = next;
  79. else m_lpHead = next;
  80. if (next) next->prev = prev;
  81. else m_lpTail = prev;
  82. GlobalFree(lpList);
  83. m_nCount--;
  84. }
  85. __finally
  86. {
  87. LeaveCriticalSection(&m_cs);
  88. }
  89. return prev;
  90. }
  91. */
  92. template <class T>BOOL CWHList<T>::RemoveNodeByKey(SOCKET s)
  93. {
  94. EnterCriticalSection(&m_cs);
  95.     LPLINKEDLIST prev = NULL, next;
  96. LPLINKEDLIST lpNode = m_lpHead;
  97. BOOL fFlag = FALSE;
  98. __try
  99. {
  100. while (lpNode)
  101. {
  102. if (((CSessionInfo*)lpNode->lpData)->sock == s)
  103. {
  104. next = lpNode->next;
  105. prev = lpNode->prev;
  106. if (prev) prev->next = next;
  107. else m_lpHead = next;
  108. if (next) next->prev = prev;
  109. else m_lpTail = prev;
  110. GlobalFree(lpNode);
  111. m_nCount--;
  112. fFlag = TRUE;
  113. break;
  114. }
  115. lpNode = lpNode->next;
  116. }
  117. }
  118. __finally
  119. {
  120. LeaveCriticalSection(&m_cs);
  121. }
  122. return fFlag;
  123. }
  124. template <class T>BOOL CWHList<T>::RemoveNodeByData(T lpData)
  125. {
  126. // EnterCriticalSection(&m_cs);
  127.     LPLINKEDLIST prev = NULL, next;
  128. LPLINKEDLIST lpNode = m_lpHead;
  129. BOOL fFlag = FALSE;
  130. __try
  131. {
  132. while (lpNode)
  133. {
  134. if ((CSessionInfo*)lpNode->lpData == lpData)
  135. {
  136. next = lpNode->next;
  137. prev = lpNode->prev;
  138. if (prev) prev->next = next;
  139. else m_lpHead = next;
  140. if (next) next->prev = prev;
  141. else m_lpTail = prev;
  142. GlobalFree(lpNode);
  143. m_nCount--;
  144. fFlag = TRUE;
  145. break;
  146. }
  147. lpNode = lpNode->next;
  148. }
  149. }
  150. __finally
  151. {
  152. // LeaveCriticalSection(&m_cs);
  153. }
  154. return fFlag;
  155. }
  156. /*
  157. LPLINKEDLIST CWHList::FindNode(LPLINKEDLIST lpList)
  158. {
  159. EnterCriticalSection(&m_cs);
  160. LPLINKEDLIST lpNode = m_lpHead;
  161. while (lpNode)
  162. {
  163. if (lpNode == lpList)
  164. return lpNode;
  165. lpNode = lpNode->next;
  166. }
  167. LeaveCriticalSection(&m_cs);
  168. return NULL;
  169. }
  170. */
  171. template <class T>T CWHList<T>::FindDataByKey(SOCKET s)
  172. {
  173. LPLINKEDLIST lpNode = m_lpHead;
  174. // EnterCriticalSection(&m_cs);
  175. while (lpNode)
  176. {
  177. if (((CSessionInfo*)lpNode->lpData)->sock == s)
  178. return (CSessionInfo*)lpNode->lpData;
  179. lpNode = lpNode->next;
  180. }
  181. // LeaveCriticalSection(&m_cs);
  182. return NULL;
  183. }