Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __XN_THREAD_SAFE_QUEUE_H__
00023 #define __XN_THREAD_SAFE_QUEUE_H__
00024
00025
00026
00027
00028 #include <XnQueue.h>
00029 #include <XnOS.h>
00030
00031
00032
00033
00037 class XnThreadSafeQueue : public XnQueue
00038 {
00039 public:
00040 XnThreadSafeQueue() : m_hLock(NULL) {}
00041
00042 ~XnThreadSafeQueue()
00043 {
00044 xnOSCloseCriticalSection(&m_hLock);
00045 }
00046
00047 XnStatus Init()
00048 {
00049 XnStatus nRetVal = XN_STATUS_OK;
00050
00051 nRetVal = xnOSCreateCriticalSection(&m_hLock);
00052 XN_IS_STATUS_OK(nRetVal);
00053
00054 return (XN_STATUS_OK);
00055 }
00056
00057 XnStatus Push(XnValue const& value)
00058 {
00059 XnStatus nRetVal = XN_STATUS_OK;
00060
00061 nRetVal = xnOSEnterCriticalSection(&m_hLock);
00062 XN_IS_STATUS_OK(nRetVal);
00063
00064 nRetVal = XnQueue::Push(value);
00065 xnOSLeaveCriticalSection(&m_hLock);
00066
00067 return nRetVal;
00068 }
00069
00070 XnStatus Pop(XnValue& value)
00071 {
00072 XnStatus nRetVal = XN_STATUS_OK;
00073
00074 nRetVal = xnOSEnterCriticalSection(&m_hLock);
00075 XN_IS_STATUS_OK(nRetVal);
00076
00077 nRetVal = XnQueue::Pop(value);
00078 xnOSLeaveCriticalSection(&m_hLock);
00079
00080 return nRetVal;
00081 }
00082
00083 XnUInt32 Size() const
00084 {
00085 xnOSEnterCriticalSection(&m_hLock);
00086 XnUInt32 nSize = XnQueue::Size();
00087 xnOSLeaveCriticalSection(&m_hLock);
00088 return (nSize);
00089 }
00090
00091 private:
00092
00093 mutable XN_CRITICAL_SECTION_HANDLE m_hLock;
00094 };
00095
00101 #define XN_DECLARE_THREAD_SAFE_QUEUE_WITH_TRANSLATOR_DECL(decl, Type, ClassName, Translator) \
00102 class decl ClassName : public XnThreadSafeQueue \
00103 { \
00104 public: \
00105 ~ClassName() \
00106 { \
00107 \
00108 Type dummy; \
00109 while (Size() != 0) \
00110 Pop(dummy); \
00111 } \
00112 XnStatus Push(Type const& value) \
00113 { \
00114 XnValue val = Translator::CreateValueCopy(value); \
00115 XnStatus nRetVal = XnThreadSafeQueue::Push(val); \
00116 if (nRetVal != XN_STATUS_OK) \
00117 { \
00118 Translator::FreeValue(val); \
00119 return (nRetVal); \
00120 } \
00121 return XN_STATUS_OK; \
00122 } \
00123 XnStatus Pop(Type& value) \
00124 { \
00125 XnValue val; \
00126 XnStatus nRetVal = XnThreadSafeQueue::Pop(val); \
00127 if (nRetVal != XN_STATUS_OK) return (nRetVal); \
00128 value = Translator::GetFromValue(val); \
00129 return XN_STATUS_OK; \
00130 } \
00131 };
00132
00138 #define XN_DECLARE_THREAD_SAFE_QUEUE_WITH_TRANSLATOR(Type, ClassName, Translator) \
00139 XN_DECLARE_THREAD_SAFE_QUEUE_WITH_TRANSLATOR_DECL(, Type, ClassName, Translator)
00140
00145 #define XN_DECLARE_THREAD_SAFE_QUEUE_DECL(decl, Type, ClassName) \
00146 XN_DECLARE_DEFAULT_VALUE_TRANSLATOR_DECL(decl, Type, XN_DEFAULT_TRANSLATOR_NAME(ClassName)) \
00147 XN_DECLARE_THREAD_SAFE_QUEUE_WITH_TRANSLATOR_DECL(decl, Type, ClassName, XN_DEFAULT_TRANSLATOR_NAME(ClassName))
00148
00152 #define XN_DECLARE_THREAD_SAFE_QUEUE(Type, ClassName) \
00153 XN_DECLARE_THREAD_SAFE_QUEUE_DECL(, Type, ClassName)
00154
00155 #endif //__XN_THREAD_SAFE_QUEUE_H__