VR-Link API Documentation for HLA 1516
vlThreadSafe.h
Go to the documentation of this file.
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 

Document ID: Generated on Mon May 14 08:06:18 EDT 2012 from SVN revision 114750
Copyright © 2005-2012 VT MÄK Inc. All Rights Reserved (www.mak.com)