00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "stdafx.h"
00037 #include "RWAutoRelease.h"
00038
00039 #include "GenericReadWriteLock.h"
00040
00041 #ifdef _MEMORY_DEBUG
00042 #define new DEBUG_NEW
00043 #define malloc DEBUG_MALLOC
00044 static char THIS_FILE[] = __FILE__;
00045 #endif
00046
00047 KOMODIA_NAMESPACE_START
00048
00049 CRWAutoRelease::CRWAutoRelease(CGenericReadWriteLock* pLock,
00050 BOOL bRead,
00051 BOOL bLock) : m_pLock(pLock),
00052 m_bLockedRead(FALSE),
00053 m_bLockedWrite(FALSE),
00054 m_bEscalated(FALSE)
00055 {
00056
00057 if (bLock)
00058 if (bRead)
00059 if (LockRead())
00060 m_bLockedRead=TRUE;
00061 else
00062 ;
00063 else
00064 if (LockWrite())
00065 m_bLockedWrite=TRUE;
00066 }
00067
00068 CRWAutoRelease::~CRWAutoRelease()
00069 {
00070
00071 if (m_bLockedRead)
00072 UnlockRead();
00073 else if (m_bLockedWrite)
00074 UnlockWrite();
00075
00076
00077 if (m_bEscalated)
00078 StopEscalation();
00079 }
00080
00081 BOOL CRWAutoRelease::LockRead(unsigned long ulMSTimeout)
00082 {
00083 if (m_pLock)
00084 if (m_pLock->LockRead(ulMSTimeout))
00085 {
00086
00087 m_bLockedRead=TRUE;
00088
00089
00090 return FALSE;
00091 }
00092 else
00093 return FALSE;
00094 else
00095 return FALSE;
00096 }
00097
00098 void CRWAutoRelease::UnlockRead()
00099 {
00100 if (m_pLock && m_bLockedRead)
00101 {
00102
00103 m_pLock->UnlockRead();
00104
00105
00106 m_bLockedRead=FALSE;
00107 }
00108 }
00109
00110 BOOL CRWAutoRelease::LockWrite()
00111 {
00112 if (m_pLock)
00113 if (m_pLock->LockWrite())
00114 {
00115
00116 m_bLockedWrite=TRUE;
00117
00118
00119 return TRUE;
00120 }
00121 else
00122 return FALSE;
00123 else
00124 return FALSE;
00125 }
00126
00127 void CRWAutoRelease::UnlockWrite()
00128 {
00129
00130 if (m_pLock && m_bLockedWrite)
00131 {
00132
00133 m_pLock->UnlockWrite();
00134
00135
00136 m_bLockedWrite=FALSE;
00137
00138
00139 m_bEscalated=FALSE;
00140 }
00141 }
00142
00143 BOOL CRWAutoRelease::Escalate(unsigned long ulMSTimeout,
00144 unsigned long ulIterations)
00145 {
00146 if (m_pLock)
00147 if (m_pLock->Escalate(ulMSTimeout,ulIterations))
00148 {
00149
00150 m_bLockedWrite=TRUE;
00151
00152
00153 m_bEscalated=TRUE;
00154
00155
00156 return TRUE;
00157 }
00158 else
00159 return FALSE;
00160 else
00161 return FALSE;
00162 }
00163
00164 void CRWAutoRelease::StopEscalation()
00165 {
00166 if (m_pLock && m_bEscalated)
00167 {
00168
00169 m_pLock->StopEscalation();
00170
00171
00172 m_bEscalated=FALSE;
00173 }
00174 }
00175
00176 KOMODIA_NAMESPACE_END