Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

262 lines
4.6 KiB

  1. /*++
  2. Copyright (c) 1997 Microsoft Corporation
  3. Module Name:
  4. priolist.hxx
  5. Abstract:
  6. Contains Prioritized serialized list class definitions
  7. Author:
  8. Richard L Firth (rfirth) 03-May-1997
  9. Revision History:
  10. 03-May-1997 rfirth
  11. Created
  12. --*/
  13. //
  14. // classes
  15. //
  16. //
  17. // CPriorityListEntry - prioritized list entry
  18. //
  19. class CPriorityListEntry {
  20. public:
  21. LIST_ENTRY m_ListEntry;
  22. private:
  23. LONG m_lPriority;
  24. public:
  25. CPriorityListEntry(LONG lPriority) {
  26. #if INET_DEBUG
  27. m_ListEntry.Flink = m_ListEntry.Blink = NULL;
  28. #endif
  29. m_lPriority = lPriority;
  30. }
  31. ~CPriorityListEntry() {
  32. INET_ASSERT((m_ListEntry.Flink == NULL)
  33. && (m_ListEntry.Blink == NULL));
  34. }
  35. PLIST_ENTRY List(VOID) {
  36. return &m_ListEntry;
  37. }
  38. PLIST_ENTRY Next(VOID) {
  39. return m_ListEntry.Flink;
  40. }
  41. PLIST_ENTRY Prev(VOID) {
  42. return m_ListEntry.Blink;
  43. }
  44. LONG GetPriority(VOID) const {
  45. return m_lPriority;
  46. }
  47. VOID SetPriority(LONG lPriority) {
  48. m_lPriority = lPriority;
  49. }
  50. VOID Remove(VOID) {
  51. RemoveEntryList(&m_ListEntry);
  52. #if INET_DEBUG
  53. m_ListEntry.Flink = m_ListEntry.Blink = NULL;
  54. #endif
  55. }
  56. };
  57. //
  58. // CPriorityList - maintains serialized list of CPriorityListEntry's
  59. //
  60. class CPriorityList {
  61. private:
  62. SERIALIZED_LIST m_List;
  63. public:
  64. CPriorityList() {
  65. InitializeSerializedList(&m_List);
  66. }
  67. ~CPriorityList() {
  68. TerminateSerializedList(&m_List);
  69. }
  70. LPSERIALIZED_LIST List(VOID) {
  71. return &m_List;
  72. }
  73. PLIST_ENTRY Self(VOID) {
  74. return (PLIST_ENTRY)&m_List.List.Flink;
  75. }
  76. PLIST_ENTRY Head(VOID) {
  77. return m_List.List.Flink;
  78. }
  79. BOOL Acquire(VOID) {
  80. return LockSerializedList(&m_List);
  81. }
  82. VOID Release(VOID) {
  83. UnlockSerializedList(&m_List);
  84. }
  85. BOOL IsEmpty(VOID) {
  86. return IsSerializedListEmpty(&m_List);
  87. }
  88. LONG Count(VOID) {
  89. return ElementsOnSerializedList(&m_List);
  90. }
  91. DWORD
  92. Insert(
  93. IN CPriorityListEntry * pEntry,
  94. IN LONG lPriority
  95. ) {
  96. pEntry->SetPriority(lPriority);
  97. return Insert(pEntry);
  98. }
  99. DWORD
  100. Insert(
  101. IN CPriorityListEntry * pEntry
  102. );
  103. DWORD
  104. Remove(
  105. IN CPriorityListEntry * pEntry
  106. );
  107. CPriorityListEntry * RemoveHead(VOID) {
  108. return (CPriorityListEntry * )SlDequeueHead(&m_List);
  109. }
  110. };
  111. template <class TData> class CTList
  112. {
  113. protected:
  114. struct CTListItem
  115. {
  116. struct CTListItem *_pNext;
  117. TData _Data;
  118. CTListItem(const TData &data, CTListItem *pNext)
  119. : _Data(data), _pNext(pNext){}
  120. };
  121. ULONG _nItems;
  122. struct CTListItem *_pHead;
  123. struct CTListItem *_pTail;
  124. public:
  125. CTList()
  126. {
  127. _nItems = 0;
  128. _pHead = NULL;
  129. _pTail = NULL;
  130. }
  131. ULONG GetCount()
  132. {
  133. return _nItems;
  134. }
  135. BOOL AddAtHead(TData Data)
  136. {
  137. struct CTListItem *pNewItem = New CTListItem(Data, _pHead);
  138. if (pNewItem)
  139. {
  140. _pHead = pNewItem;
  141. if (_nItems == 0)
  142. _pTail = _pHead;
  143. ++_nItems;
  144. return TRUE;
  145. }
  146. return FALSE;
  147. }
  148. BOOL AddToTail(TData Data)
  149. {
  150. struct CTListItem *pNewItem = New CTListItem(Data, NULL);
  151. if (pNewItem)
  152. {
  153. if (_pTail)
  154. {
  155. _pTail->_pNext = pNewItem;
  156. }
  157. else
  158. {
  159. _pHead = pNewItem;
  160. }
  161. _pTail = pNewItem;
  162. ++_nItems;
  163. return TRUE;
  164. }
  165. return FALSE;
  166. }
  167. BOOL DequeueHead(TData *pData)
  168. {
  169. if (_pHead && pData)
  170. {
  171. struct CTListItem *pItem = _pHead;
  172. *pData = _pHead->_Data;
  173. _pHead = _pHead->_pNext;
  174. if (--_nItems == 0)
  175. _pTail = NULL;
  176. delete pItem;
  177. return TRUE;
  178. }
  179. else
  180. {
  181. return FALSE;
  182. }
  183. }
  184. VOID RemoveAll()
  185. {
  186. struct CTListItem *pItem = _pHead;
  187. while (pItem)
  188. {
  189. pItem = _pHead->_pNext;
  190. delete _pHead;
  191. _pHead = pItem;
  192. }
  193. _pTail = NULL;
  194. _nItems = 0;
  195. }
  196. ~CTList()
  197. {
  198. RemoveAll();
  199. }
  200. };