#ifndef THREADSAFEQUEUE_H #define THREADSAFEQUEUE_H // ACC - July 10, 2002 #include #ifdef WIN32 #ifdef XBOX #include #else #include #endif using namespace std; template class ThreadSafeQueue { public: ThreadSafeQueue(); virtual ~ ThreadSafeQueue(); void Add(const Item& aItem); Item Remove(); bool IsEmpty(); unsigned int NumItems(); ///private: //not implemented ThreadSafeQueue(const ThreadSafeQueue& aThreadSafeQueue); ThreadSafeQueue& operator=( const ThreadSafeQueue& aThreadSafeQueue); CRITICAL_SECTION mGuardAccess; list mQueue; }; template ThreadSafeQueue::ThreadSafeQueue() { InitializeCriticalSection(&mGuardAccess); } template ThreadSafeQueue::~ThreadSafeQueue() { EnterCriticalSection(&mGuardAccess); mQueue.clear(); LeaveCriticalSection(&mGuardAccess); DeleteCriticalSection(&mGuardAccess); } template void ThreadSafeQueue::Add(const Item& aItem)\ { EnterCriticalSection(&mGuardAccess); mQueue.push_front(aItem); LeaveCriticalSection(&mGuardAccess); } template Item ThreadSafeQueue::Remove() { EnterCriticalSection(&mGuardAccess); Item item; if( !mQueue.empty() ) { item = mQueue.back(); mQueue.pop_back(); } LeaveCriticalSection(&mGuardAccess); return item; } template bool ThreadSafeQueue::IsEmpty() { EnterCriticalSection(&mGuardAccess); bool isempty = mQueue.empty(); LeaveCriticalSection(&mGuardAccess); return isempty; } template unsigned int ThreadSafeQueue::NumItems() { EnterCriticalSection(&mGuardAccess); unsigned int items = mQueue.size(); LeaveCriticalSection(&mGuardAccess); return items; } #endif //WIN32 #endif //THREADSAFEQUEUE_H