![]() |
VR-Link API Documentation for DIS
|
00001 /****************************************************************************** 00002 ** Copyright (c) 1992-2010 VT MAK 00003 ** All rights reserved. 00004 ******************************************************************************/ 00009 #pragma once 00010 00011 #include "vlMachineTypes.h" 00012 00013 #include "vlMutex.h" 00014 #include "vlScopedLock.h" 00015 00016 #ifdef DtUSE_UTILITIES_NAMESPACE 00017 namespace DtUSE_UTILITIES_NAMESPACE 00018 { 00019 #endif 00020 00021 00022 00046 00047 class DT_DLL_VLUTIL DtScopedSequenceLock 00048 { 00049 public: 00051 typedef void (*LockFunction)(void*); 00052 00055 DtScopedSequenceLock(const DtScopedSequenceLock& orig); 00056 00058 virtual ~DtScopedSequenceLock(); 00059 00060 protected: 00061 00063 DtScopedSequenceLock(void* object,LockFunction lockCB,LockFunction unlockCB); 00064 00066 LockFunction myLockCallback; 00067 00069 LockFunction myUnlockCallback; 00070 00072 void* myObject; 00073 }; 00074 00075 00102 00103 template <typename T> 00104 class DtThreadSafe 00105 { 00106 #ifndef __solaris__ 00107 protected: 00108 #else 00109 public: 00110 #endif 00111 class LockedProxy; 00112 class ConstLockedProxy; 00113 friend class SequenceLockImpl; 00114 public: 00115 00116 // Preferred Constructor to ensure that the value is defined. 00117 explicit DtThreadSafe(const T& value); 00118 00119 // Fallback Constructor, there is a good chance that T does not have a valid default value on 00120 // some systems (ie do not assume zero). 00121 explicit DtThreadSafe(); 00122 00124 operator T() const; 00125 00128 LockedProxy operator->(); 00129 00132 ConstLockedProxy operator->() const; 00133 00135 DtThreadSafe<T>& operator =(const DtThreadSafe<T>& orig); 00136 00138 DtThreadSafe<T>& operator =(const T& orig); 00139 00143 DtScopedSequenceLock sequenceLock(); 00144 00145 #ifndef __solaris__ 00146 protected: 00147 #else 00148 public: 00149 #endif 00150 00153 class LockedProxy 00154 { 00155 public: 00157 LockedProxy(T& value,DtMutex& mutex); 00159 LockedProxy(const LockedProxy& orig); 00161 ~LockedProxy(); 00162 00166 T* operator->(); 00167 00168 protected: 00169 T* myValue; 00170 DtMutex& myMutex; 00171 DtScopedLock myLock; 00172 }; 00173 00176 class ConstLockedProxy 00177 { 00178 public: 00180 ConstLockedProxy(const T& value,DtMutex& mutex); 00182 ConstLockedProxy(const ConstLockedProxy& orig); 00184 ~ConstLockedProxy(); 00185 00189 const T* operator->(); 00190 00191 protected: 00192 const T* myValue; 00193 DtMutex& myMutex; 00194 DtScopedLock myLock; 00195 }; 00196 00197 00200 class SequenceLockImpl : public DtScopedSequenceLock 00201 { 00202 public: 00204 SequenceLockImpl(DtThreadSafe* object); 00205 00207 virtual ~SequenceLockImpl(); 00208 00210 static void lock(void* object); 00211 00213 static void unlock(void* object); 00214 }; 00215 00217 void lockObject(); 00218 00220 void unlockObject(); 00221 00223 T myValue; 00226 DtScopedLock* myExternalLock; 00227 00229 DtMutex myLockMutex; 00230 00232 mutable DtMutex myMutex; 00233 }; 00234 00235 #define vlThreadSafe_inl_ 00236 #include "vlThreadSafe.inl" 00237 #undef vlThreadSafe_inl_ 00238 00239 #ifdef DtUSE_UTILITIES_NAMESPACE 00240 } 00241 #endif 00242