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
262 lines
4.6 KiB
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
priolist.hxx
|
|
|
|
Abstract:
|
|
|
|
Contains Prioritized serialized list class definitions
|
|
|
|
Author:
|
|
|
|
Richard L Firth (rfirth) 03-May-1997
|
|
|
|
Revision History:
|
|
|
|
03-May-1997 rfirth
|
|
Created
|
|
|
|
--*/
|
|
|
|
//
|
|
// classes
|
|
//
|
|
|
|
//
|
|
// CPriorityListEntry - prioritized list entry
|
|
//
|
|
|
|
class CPriorityListEntry {
|
|
|
|
public:
|
|
|
|
LIST_ENTRY m_ListEntry;
|
|
|
|
private:
|
|
|
|
LONG m_lPriority;
|
|
|
|
public:
|
|
|
|
CPriorityListEntry(LONG lPriority) {
|
|
#if INET_DEBUG
|
|
m_ListEntry.Flink = m_ListEntry.Blink = NULL;
|
|
#endif
|
|
m_lPriority = lPriority;
|
|
}
|
|
|
|
~CPriorityListEntry() {
|
|
|
|
INET_ASSERT((m_ListEntry.Flink == NULL)
|
|
&& (m_ListEntry.Blink == NULL));
|
|
|
|
}
|
|
|
|
PLIST_ENTRY List(VOID) {
|
|
return &m_ListEntry;
|
|
}
|
|
|
|
PLIST_ENTRY Next(VOID) {
|
|
return m_ListEntry.Flink;
|
|
}
|
|
|
|
PLIST_ENTRY Prev(VOID) {
|
|
return m_ListEntry.Blink;
|
|
}
|
|
|
|
LONG GetPriority(VOID) const {
|
|
return m_lPriority;
|
|
}
|
|
|
|
VOID SetPriority(LONG lPriority) {
|
|
m_lPriority = lPriority;
|
|
}
|
|
|
|
VOID Remove(VOID) {
|
|
RemoveEntryList(&m_ListEntry);
|
|
#if INET_DEBUG
|
|
m_ListEntry.Flink = m_ListEntry.Blink = NULL;
|
|
#endif
|
|
}
|
|
};
|
|
|
|
//
|
|
// CPriorityList - maintains serialized list of CPriorityListEntry's
|
|
//
|
|
|
|
class CPriorityList {
|
|
|
|
private:
|
|
|
|
SERIALIZED_LIST m_List;
|
|
|
|
public:
|
|
|
|
CPriorityList() {
|
|
InitializeSerializedList(&m_List);
|
|
}
|
|
|
|
~CPriorityList() {
|
|
TerminateSerializedList(&m_List);
|
|
}
|
|
|
|
LPSERIALIZED_LIST List(VOID) {
|
|
return &m_List;
|
|
}
|
|
|
|
PLIST_ENTRY Self(VOID) {
|
|
return (PLIST_ENTRY)&m_List.List.Flink;
|
|
}
|
|
|
|
PLIST_ENTRY Head(VOID) {
|
|
return m_List.List.Flink;
|
|
}
|
|
|
|
BOOL Acquire(VOID) {
|
|
return LockSerializedList(&m_List);
|
|
}
|
|
|
|
VOID Release(VOID) {
|
|
UnlockSerializedList(&m_List);
|
|
}
|
|
|
|
BOOL IsEmpty(VOID) {
|
|
return IsSerializedListEmpty(&m_List);
|
|
}
|
|
|
|
LONG Count(VOID) {
|
|
return ElementsOnSerializedList(&m_List);
|
|
}
|
|
|
|
DWORD
|
|
Insert(
|
|
IN CPriorityListEntry * pEntry,
|
|
IN LONG lPriority
|
|
) {
|
|
pEntry->SetPriority(lPriority);
|
|
return Insert(pEntry);
|
|
}
|
|
|
|
DWORD
|
|
Insert(
|
|
IN CPriorityListEntry * pEntry
|
|
);
|
|
|
|
DWORD
|
|
Remove(
|
|
IN CPriorityListEntry * pEntry
|
|
);
|
|
|
|
CPriorityListEntry * RemoveHead(VOID) {
|
|
return (CPriorityListEntry * )SlDequeueHead(&m_List);
|
|
}
|
|
};
|
|
|
|
|
|
template <class TData> class CTList
|
|
{
|
|
protected:
|
|
|
|
struct CTListItem
|
|
{
|
|
struct CTListItem *_pNext;
|
|
TData _Data;
|
|
CTListItem(const TData &data, CTListItem *pNext)
|
|
: _Data(data), _pNext(pNext){}
|
|
};
|
|
|
|
ULONG _nItems;
|
|
struct CTListItem *_pHead;
|
|
struct CTListItem *_pTail;
|
|
|
|
public:
|
|
CTList()
|
|
{
|
|
_nItems = 0;
|
|
_pHead = NULL;
|
|
_pTail = NULL;
|
|
}
|
|
|
|
ULONG GetCount()
|
|
{
|
|
return _nItems;
|
|
}
|
|
|
|
BOOL AddAtHead(TData Data)
|
|
{
|
|
struct CTListItem *pNewItem = New CTListItem(Data, _pHead);
|
|
|
|
if (pNewItem)
|
|
{
|
|
_pHead = pNewItem;
|
|
if (_nItems == 0)
|
|
_pTail = _pHead;
|
|
++_nItems;
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL AddToTail(TData Data)
|
|
{
|
|
struct CTListItem *pNewItem = New CTListItem(Data, NULL);
|
|
|
|
if (pNewItem)
|
|
{
|
|
if (_pTail)
|
|
{
|
|
_pTail->_pNext = pNewItem;
|
|
}
|
|
else
|
|
{
|
|
_pHead = pNewItem;
|
|
}
|
|
_pTail = pNewItem;
|
|
++_nItems;
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL DequeueHead(TData *pData)
|
|
{
|
|
if (_pHead && pData)
|
|
{
|
|
struct CTListItem *pItem = _pHead;
|
|
*pData = _pHead->_Data;
|
|
_pHead = _pHead->_pNext;
|
|
if (--_nItems == 0)
|
|
_pTail = NULL;
|
|
delete pItem;
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
VOID RemoveAll()
|
|
{
|
|
struct CTListItem *pItem = _pHead;
|
|
|
|
while (pItem)
|
|
{
|
|
pItem = _pHead->_pNext;
|
|
delete _pHead;
|
|
_pHead = pItem;
|
|
}
|
|
_pTail = NULL;
|
|
_nItems = 0;
|
|
}
|
|
|
|
~CTList()
|
|
{
|
|
RemoveAll();
|
|
}
|
|
};
|
|
|
|
|