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