00001 // MessageBuffers.cpp: implementation of the CMessageBuffers class. 00002 // 00004 00005 #include "Platform.h" 00006 #include <assert.h> 00007 #include "Declarations.h" 00008 #include "Message.h" 00009 #include "LockMechanism.h" 00010 #include "MessageBuffers.h" 00011 00013 // Construction/Destruction 00015 00016 // 00017 // constructor (basic variable initialization) 00018 // 00019 CMessagePool::CMessagePool(): CLockMechanism() 00020 { 00021 m_pCMessages = NULL; 00022 m_pTakenBuffer = NULL; 00023 m_bInitialized = false; 00024 m_iSharedReferences = 0; 00025 m_iNumBuffers = 0; 00026 } 00027 00028 00029 // 00030 // destructor (mandatory clean-up deinitialize) 00031 // 00032 CMessagePool::~CMessagePool() 00033 { 00034 Deinitialize(); 00035 } 00036 00037 // CMessagePool::Initialize() 00051 bool CMessagePool::Initialize( UINT32 numbuffers ) 00052 { 00053 if (m_bInitialized == true) return false; 00054 00055 if (!lock()) return false; 00056 00057 assert( numbuffers > 0 ); 00058 00059 m_pCMessages = new CMessage[numbuffers]; 00060 assert( m_pCMessages != NULL); 00061 00062 m_pTakenBuffer = new UINT32[numbuffers]; 00063 assert(m_pTakenBuffer != NULL); 00064 00065 for (UINT32 i=0;i<numbuffers;i++) 00066 { 00067 m_pTakenBuffer[i] = 0; 00068 } 00069 00070 m_bInitialized = true; 00071 m_iSharedReferences = 0; 00072 m_iNumBuffers = numbuffers; 00073 00074 unlock(); 00075 00076 return true; 00077 } 00078 00079 // 00080 // CMessagePool::Deinitialize() 00092 bool CMessagePool::Deinitialize() 00093 { 00094 if (m_bInitialized == true) 00095 { 00096 if (!lock()) return false; 00097 00098 _DEBUG_(if (m_iSharedReferences>0) printf("clean CMessagePool: m_iSharedReferences=%d\n",m_iSharedReferences)); 00099 assert( m_iSharedReferences == 0 ); 00100 00101 delete [] m_pCMessages; 00102 delete [] m_pTakenBuffer; 00103 00104 m_pCMessages = NULL; 00105 m_bInitialized = false; 00106 m_iSharedReferences = 0; 00107 m_iNumBuffers = 0; 00108 m_pTakenBuffer = NULL; 00109 00110 unlock(); 00111 } 00112 00113 return true; 00114 } 00115 00116 // 00117 // CMessagePool::acquire_reference() 00118 // 00129 CMessage *CMessagePool::acquire_reference() 00130 { 00131 if (m_bInitialized == false) return NULL; 00132 00133 if (!lock()) return NULL; 00134 00135 CMessage *retval=NULL; 00136 00137 for (UINT32 i=0;i<m_iNumBuffers;i++) 00138 { 00139 if (m_pTakenBuffer[i] == 0) 00140 { 00141 m_pTakenBuffer[i] = 1; 00142 retval = &(m_pCMessages[i]); 00143 m_iSharedReferences++; 00144 break; 00145 } 00146 } 00147 00148 unlock(); 00149 00150 return retval; // nothing free or buffer ptr 00151 } 00152 00153 // 00154 // CMessagePool::increment_referencecount() 00155 // 00170 bool CMessagePool::increment_referencecount( CMessage *buffer_ref ) 00171 { 00172 bool retval = false; 00173 if (m_bInitialized == false) return retval; 00174 00175 if (!lock()) return false; 00176 00177 for (UINT32 i=0;i<m_iNumBuffers;i++) 00178 { 00179 if (&(m_pCMessages[i]) == buffer_ref) 00180 { 00181 assert( m_pTakenBuffer[i] > 0); 00182 if (m_pTakenBuffer > 0) 00183 { 00184 m_pTakenBuffer[i]++; 00185 retval = true; 00186 } 00187 else retval = false; 00188 00189 break; 00190 } 00191 } 00192 00193 unlock(); 00194 00195 return retval; // nothing free or buffer ptr 00196 } 00197 00198 00199 // 00200 // CMessagePool::putback_reference() 00201 // 00221 bool CMessagePool::putback_reference( CMessage *ref ) 00222 { 00223 if (m_bInitialized == false) return false; 00224 00225 bool retval = false; 00226 00227 if (!lock()) return retval; 00228 00229 for (UINT32 i=0;i<m_iNumBuffers;i++) 00230 { 00231 if (&(m_pCMessages[i]) == ref) 00232 { 00233 assert( m_pTakenBuffer[i] >= 1); 00234 m_pTakenBuffer[i]--; 00235 00236 // clear it if put back(!) important step 00237 if (m_pTakenBuffer[i] == 0) 00238 { 00239 m_pCMessages[i].clear(); 00240 assert(m_iSharedReferences > 0); 00241 m_iSharedReferences--; 00242 } 00243 00244 retval = true; 00245 } 00246 } 00247 00248 unlock(); 00249 00250 return retval; 00251 }