• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

spl/collection/Queue.h

00001 #ifndef _queue_h
00002 #define _queue_h
00003 
00004 #include <spl/types.h>
00005 #include <spl/Debug.h>
00006 #include <spl/Memory.h>
00007 #include <spl/threading/Event.h>
00008 #include <spl/threading/Mutex.h>
00009 #include <spl/collection/List.h>
00010 
00011 template<class T>
00012 class Queue : public IMemoryValidate
00013 {
00014 protected:
00015         List<T> m_q;
00016         Mutex m_lock;
00017         Event m_event;
00018         
00019         inline T _Get()
00020         {
00021                 T t = m_q.Tail();
00022                 m_q.RemoveTail();
00023                 return t;
00024         }
00025         
00026 public:
00027         Queue()
00028         {
00029         }
00030         
00031         virtual ~Queue()
00032         {
00033         }
00034         
00035         void Put(T t)
00036         {
00037                 m_lock.Lock();
00038                 m_q.Add(t);
00039                 m_lock.Unlock();
00040                 m_event.Notify();
00041         }
00042         
00043         T Get()
00044         {
00045                 while(true)
00046                 {
00047                         m_lock.Lock();
00048                         if (m_q.Count() > 0)
00049                         {
00050                                 T t = _Get();
00051                                 m_lock.Unlock();
00052                                 return t;
00053                         }
00054                         m_lock.Unlock();
00055                         m_event.Wait();
00056                 }
00057         }
00058         
00059 #ifdef DEBUG
00060         virtual void ValidateMem() const
00061         {
00062                 m_q.ValidateMem();
00063         }
00064         
00065         virtual void CheckMem() const
00066         {
00067                 m_q.CheckMem();
00068         }
00069 #endif
00070 };
00071 
00072 #endif