windows-nt/Source/XPSP1/NT/net/tapi/skywalker/cc/inc/que.h
2020-09-26 16:20:57 +08:00

95 lines
3.1 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// INTEL Corporation Proprietary Information
// This listing is supplied under the terms of a license agreement with Intel
// Corporation and many not be copied nor disclosed except in accordance
// with the terms of that agreement.
// Copyright (c) 11/95 Intel Corporation.
//
//
// Module Name: que.h
// Abstract: header file. Generic queing structure.
// Environment: MSVC 2.0, OLE 2
/////////////////////////////////////////////////////////////////////////////////
//NOTE: To use this que structure, you must include this file. You create a Que object.
// Using the que object you can call deque and enque. You can enqueue any object of a
// class derived from QueItem. In that derived class you add any fields you will need.
// (eg. a buffer pointer field, and a length field). There is no limit on the size of
// the que.
/////////////////////////////////////////////////////////////////////////////////
#ifndef QUE_H
#define QUE_H
//Don't really need winsock2.h but it has guards against including
//Winsock.h and it includes windows.h which is what I want.
//#include <windows.h>
#include <winsock2.h>
#include <wtypes.h>
class QueueItem {
friend class Queue;
private:
QueueItem* m_pNext;
QueueItem* m_pPrev;
public:
QueueItem::QueueItem(){m_pNext = NULL; m_pPrev= NULL;}
}; //end QueItem class
///////////////////////////////////////
class Queue {
private:
QueueItem* m_pHead;
QueueItem* m_pTail;
int m_NumItems;
CRITICAL_SECTION m_CritSect;
public:
// constructor
Queue();
//inline destructor
~Queue(){DeleteCriticalSection(&m_CritSect);}
// NOTE:
// Enqueue and Dequeue(void) are protected against simultaneous access by multiple threads.
// Obviously, this protection does not extend to threads using GetHead, GetTail, GetPrev, GetNext,
// and Dequeue(QueueItem *). Any threads using these functions and any other threads operating
// on the same queue must use an additional critical section.
//Add item to end of queue. Returns E_FAIL for a corrupt que or NOERROR for success
HRESULT Enqueue(QueueItem* item);
//Remove and return first item in queue. Returns NULL if queue is empty.
QueueItem* Dequeue();
//Remove a specific item from queue
void Dequeue(QueueItem *);
//Return first item in queue without removing it. Returns NULL if queue is empty.
QueueItem *GetHead() { return m_pHead; };
//Return last item in queue without removing it. Returns NULL if queue is empty.
QueueItem *GetTail() { return m_pTail; };
//Return the item following the item specified. Returns NULL if specified item is the last in the queue.
QueueItem *GetNext(QueueItem *item) { return item->m_pNext; };
//Return the item preceding the item specified. Returns NULL if specified item is the first in the queue.
QueueItem *GetPrev(QueueItem *item) { return item->m_pPrev; };
//inline. Checks to see if que is empty
BOOL Is_Empty() {return (BOOL)(!(m_pHead) && !(m_pTail));};
//inline returns number of items in list.
int NumItems() {return m_NumItems;};
}; //end Queue class
#endif