00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __XN_OS_CPP_H__
00023 #define __XN_OS_CPP_H__
00024
00025
00026
00027
00028 #include <XnOS.h>
00029
00030
00031
00032
00033 class XnAutoCSLocker
00034 {
00035 public:
00036 inline XnAutoCSLocker(const XnAutoCSLocker& other) : m_hCS(other.m_hCS), m_bLocked(FALSE)
00037 {
00038 Lock();
00039 }
00040
00041 inline XnAutoCSLocker& operator=(const XnAutoCSLocker& other)
00042 {
00043 Unlock();
00044 m_hCS = other.m_hCS;
00045 Lock();
00046 return *this;
00047 }
00048
00049 inline XnAutoCSLocker(XN_CRITICAL_SECTION_HANDLE hCS) : m_hCS(hCS), m_bLocked(FALSE)
00050 {
00051 Lock();
00052 }
00053
00054 inline ~XnAutoCSLocker()
00055 {
00056 Unlock();
00057 }
00058
00059 inline void Lock()
00060 {
00061 if (!m_bLocked)
00062 {
00063 XnStatus nRetVal = xnOSEnterCriticalSection(&m_hCS);
00064 XN_ASSERT(nRetVal == XN_STATUS_OK);
00065 m_bLocked = TRUE;
00066 }
00067 }
00068
00069 inline void Unlock()
00070 {
00071 if (m_bLocked)
00072 {
00073 XnStatus nRetVal = xnOSLeaveCriticalSection(&m_hCS);
00074 XN_ASSERT(nRetVal == XN_STATUS_OK);
00075 m_bLocked = FALSE;
00076 }
00077 }
00078
00079 private:
00080 XN_CRITICAL_SECTION_HANDLE m_hCS;
00081 XnBool m_bLocked;
00082 };
00083
00084 class XnAutoMutexLocker
00085 {
00086 public:
00087 inline XnAutoMutexLocker(XN_MUTEX_HANDLE hMutex, XnUInt32 nMilliseconds) : m_hMutex(hMutex)
00088 {
00089 m_nStatus = xnOSLockMutex(m_hMutex, nMilliseconds);
00090 }
00091
00092 XnStatus GetStatus() const
00093 {
00094 return m_nStatus;
00095 }
00096
00097 inline ~XnAutoMutexLocker()
00098 {
00099 if (m_nStatus == XN_STATUS_OK)
00100 {
00101
00102 xnOSUnLockMutex(m_hMutex);
00103 }
00104 }
00105
00106 private:
00107 XN_MUTEX_HANDLE m_hMutex;
00108 XnStatus m_nStatus;
00109 };
00110
00111 class XnOSEvent
00112 {
00113 public:
00114 XnOSEvent() : m_hEvent(NULL) {}
00115
00116 ~XnOSEvent()
00117 {
00118 Close();
00119 }
00120
00121 operator XN_EVENT_HANDLE() const
00122 {
00123 return m_hEvent;
00124 }
00125
00126 XnStatus Create(XnBool bManualReset)
00127 {
00128 return xnOSCreateEvent(&m_hEvent, bManualReset);
00129 }
00130
00131 XnStatus Create(const XnChar* strName, XnBool bManualReset)
00132 {
00133 return xnOSCreateNamedEvent(&m_hEvent, strName, bManualReset);
00134 }
00135
00136 XnStatus Open(const XnChar* strName)
00137 {
00138 return xnOSOpenNamedEvent(&m_hEvent, strName);
00139 }
00140
00141 XnStatus Close()
00142 {
00143 return (m_hEvent != NULL) ? xnOSCloseEvent(&m_hEvent) : XN_STATUS_OK;
00144 }
00145
00146 XnStatus Set()
00147 {
00148 return xnOSSetEvent(m_hEvent);
00149 }
00150
00151 XnStatus Reset()
00152 {
00153 return xnOSResetEvent(m_hEvent);
00154 }
00155
00156 XnStatus Wait(XnUInt32 nMilliseconds)
00157 {
00158 return xnOSWaitEvent(m_hEvent, nMilliseconds);
00159 }
00160
00161 private:
00162 XN_EVENT_HANDLE m_hEvent;
00163 };
00164
00165 #endif // __XN_OS_CPP_H__