OpenNI 1.5.4
XnThreadSafeQueue.h
Go to the documentation of this file.
1/****************************************************************************
2* *
3* OpenNI 1.x Alpha *
4* Copyright (C) 2011 PrimeSense Ltd. *
5* *
6* This file is part of OpenNI. *
7* *
8* OpenNI is free software: you can redistribute it and/or modify *
9* it under the terms of the GNU Lesser General Public License as published *
10* by the Free Software Foundation, either version 3 of the License, or *
11* (at your option) any later version. *
12* *
13* OpenNI is distributed in the hope that it will be useful, *
14* but WITHOUT ANY WARRANTY; without even the implied warranty of *
15* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16* GNU Lesser General Public License for more details. *
17* *
18* You should have received a copy of the GNU Lesser General Public License *
19* along with OpenNI. If not, see <http://www.gnu.org/licenses/>. *
20* *
21****************************************************************************/
22#ifndef __XN_THREAD_SAFE_QUEUE_H__
23#define __XN_THREAD_SAFE_QUEUE_H__
24
25//---------------------------------------------------------------------------
26// Includes
27//---------------------------------------------------------------------------
28#include <XnQueue.h>
29#include <XnOS.h>
30
31//---------------------------------------------------------------------------
32// Types
33//---------------------------------------------------------------------------
38{
39public:
40 XnThreadSafeQueue() : m_hLock(NULL) {}
41
43 {
45 }
46
48 {
49 XnStatus nRetVal = XN_STATUS_OK;
50
51 nRetVal = xnOSCreateCriticalSection(&m_hLock);
52 XN_IS_STATUS_OK(nRetVal);
53
54 return (XN_STATUS_OK);
55 }
56
57 XnStatus Push(XnValue const& value)
58 {
59 XnStatus nRetVal = XN_STATUS_OK;
60
61 nRetVal = xnOSEnterCriticalSection(&m_hLock);
62 XN_IS_STATUS_OK(nRetVal);
63
64 nRetVal = XnQueue::Push(value);
66
67 return nRetVal;
68 }
69
71 {
72 XnStatus nRetVal = XN_STATUS_OK;
73
74 nRetVal = xnOSEnterCriticalSection(&m_hLock);
75 XN_IS_STATUS_OK(nRetVal);
76
77 nRetVal = XnQueue::Pop(value);
79
80 return nRetVal;
81 }
82
83 XnUInt32 Size() const
84 {
86 XnUInt32 nSize = XnQueue::Size();
88 return (nSize);
89 }
90
91private:
92 // NOTE: we declare the lock as mutable, as it may change on const methods.
93 mutable XN_CRITICAL_SECTION_HANDLE m_hLock;
94};
95
101#define XN_DECLARE_THREAD_SAFE_QUEUE_WITH_TRANSLATOR_DECL(decl, Type, ClassName, Translator) \
102 class decl ClassName : public XnThreadSafeQueue \
103 { \
104 public: \
105 ~ClassName() \
106 { \
107 /* We do this using Pop() to make sure memory is freed. */ \
108 Type dummy; \
109 while (Size() != 0) \
110 Pop(dummy); \
111 } \
112 XnStatus Push(Type const& value) \
113 { \
114 XnValue val = Translator::CreateValueCopy(value); \
115 XnStatus nRetVal = XnThreadSafeQueue::Push(val); \
116 if (nRetVal != XN_STATUS_OK) \
117 { \
118 Translator::FreeValue(val); \
119 return (nRetVal); \
120 } \
121 return XN_STATUS_OK; \
122 } \
123 XnStatus Pop(Type& value) \
124 { \
125 XnValue val; \
126 XnStatus nRetVal = XnThreadSafeQueue::Pop(val); \
127 if (nRetVal != XN_STATUS_OK) return (nRetVal); \
128 value = Translator::GetFromValue(val); \
129 Translator::FreeValue(val); \
130 return XN_STATUS_OK; \
131 } \
132 };
133
139#define XN_DECLARE_THREAD_SAFE_QUEUE_WITH_TRANSLATOR(Type, ClassName, Translator) \
140 XN_DECLARE_THREAD_SAFE_QUEUE_WITH_TRANSLATOR_DECL(, Type, ClassName, Translator)
141
146#define XN_DECLARE_THREAD_SAFE_QUEUE_DECL(decl, Type, ClassName) \
147 XN_DECLARE_DEFAULT_VALUE_TRANSLATOR_DECL(decl, Type, XN_DEFAULT_TRANSLATOR_NAME(ClassName)) \
148 XN_DECLARE_THREAD_SAFE_QUEUE_WITH_TRANSLATOR_DECL(decl, Type, ClassName, XN_DEFAULT_TRANSLATOR_NAME(ClassName))
149
153#define XN_DECLARE_THREAD_SAFE_QUEUE(Type, ClassName) \
154 XN_DECLARE_THREAD_SAFE_QUEUE_DECL(, Type, ClassName)
155
156#endif //__XN_THREAD_SAFE_QUEUE_H__
void * XnValue
Definition: XnDataTypes.h:36
#define XN_IS_STATUS_OK(x)
Definition: XnMacros.h:60
XN_C_API XnStatus XN_C_DECL xnOSCloseCriticalSection(XN_CRITICAL_SECTION_HANDLE *pCriticalSectionHandle)
XN_C_API XnStatus XN_C_DECL xnOSEnterCriticalSection(XN_CRITICAL_SECTION_HANDLE *pCriticalSectionHandle)
XN_C_API XnStatus XN_C_DECL xnOSLeaveCriticalSection(XN_CRITICAL_SECTION_HANDLE *pCriticalSectionHandle)
XN_C_API XnStatus XN_C_DECL xnOSCreateCriticalSection(XN_CRITICAL_SECTION_HANDLE *pCriticalSectionHandle)
XnUInt32 XnStatus
Definition: XnStatus.h:34
#define XN_STATUS_OK
Definition: XnStatus.h:37
Definition: XnQueue.h:37
virtual XnStatus Pop(XnValue &value)
Definition: XnQueue.h:79
virtual XnUInt32 Size() const
Definition: XnQueue.h:121
virtual XnStatus Push(XnValue const &value)
Definition: XnQueue.h:63
Definition: XnThreadSafeQueue.h:38
XnStatus Pop(XnValue &value)
Definition: XnThreadSafeQueue.h:70
XnThreadSafeQueue()
Definition: XnThreadSafeQueue.h:40
~XnThreadSafeQueue()
Definition: XnThreadSafeQueue.h:42
XnUInt32 Size() const
Definition: XnThreadSafeQueue.h:83
XnStatus Init()
Definition: XnThreadSafeQueue.h:47
XnStatus Push(XnValue const &value)
Definition: XnThreadSafeQueue.h:57