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 //---------------------------------------------------------------------------
37 class XnThreadSafeQueue : public XnQueue
38 {
39 public:
40  XnThreadSafeQueue() : m_hLock(NULL) {}
41 
43  {
44  xnOSCloseCriticalSection(&m_hLock);
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);
65  xnOSLeaveCriticalSection(&m_hLock);
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);
78  xnOSLeaveCriticalSection(&m_hLock);
79 
80  return nRetVal;
81  }
82 
83  XnUInt32 Size() const
84  {
85  xnOSEnterCriticalSection(&m_hLock);
86  XnUInt32 nSize = XnQueue::Size();
87  xnOSLeaveCriticalSection(&m_hLock);
88  return (nSize);
89  }
90 
91 private:
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__
#define XN_IS_STATUS_OK(x)
Definition: XnMacros.h:60
XnUInt32 Size() const
Definition: XnThreadSafeQueue.h:83
XnStatus Pop(XnValue &value)
Definition: XnThreadSafeQueue.h:70
~XnThreadSafeQueue()
Definition: XnThreadSafeQueue.h:42
#define XN_STATUS_OK
Definition: XnStatus.h:37
virtual XnStatus Pop(XnValue &value)
Definition: XnQueue.h:79
XnUInt32 XnStatus
Definition: XnStatus.h:34
virtual XnStatus Push(XnValue const &value)
Definition: XnQueue.h:63
Definition: XnQueue.h:36
XnThreadSafeQueue()
Definition: XnThreadSafeQueue.h:40
void * XnValue
Definition: XnDataTypes.h:36
XN_C_API XnStatus XN_C_DECL xnOSCloseCriticalSection(XN_CRITICAL_SECTION_HANDLE *pCriticalSectionHandle)
XnStatus Init()
Definition: XnThreadSafeQueue.h:47
virtual XnUInt32 Size() const
Definition: XnQueue.h:121
XnStatus Push(XnValue const &value)
Definition: XnThreadSafeQueue.h:57
XN_C_API XnStatus XN_C_DECL xnOSCreateCriticalSection(XN_CRITICAL_SECTION_HANDLE *pCriticalSectionHandle)
Definition: XnThreadSafeQueue.h:37
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)