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