00001 #include "PlatformSW.h"
00002 #include <assert.h>
00003 #include "NQDeclarations.h"
00004 #include "NQResponseWaitQueue.h"
00005
00006
00007
00008
00009
00010
00011
00012 CNQResponseWaitQueue::CNQResponseWaitQueue() : CNQLockMechanism()
00013 {
00014 INT32 maxsize = NQ_RESPONSEWAITQUEUE_MAX_SIZE;
00015 m_iQueueMaxSize = maxsize;
00016
00017 m_pQueueValue = new NQ_WAITFORRESPONSEINT[maxsize];
00018 m_iQueueNextElement = new INT32[maxsize];
00019
00020 m_iLastError = ERR_RWQ_NONE;
00021
00022 for (int i=0;i<maxsize;i++)
00023 {
00024 m_pQueueValue[i].enabled = 0;
00025 m_iQueueNextElement[i] = -1;
00026 }
00027
00028 m_iQueueFirstElement = -1;
00029 m_iQueueLastElement = -1;
00030 m_iQueueNumElements = 0;
00031 }
00032
00033
00034
00035
00036
00037
00038
00039 CNQResponseWaitQueue::~CNQResponseWaitQueue()
00040 {
00041 delete [] m_pQueueValue;
00042 delete [] m_iQueueNextElement;
00043 }
00044
00045
00046
00047
00048
00049 bool CNQResponseWaitQueue::push_back( const NQ_WAITFORRESPONSE &obj)
00050 {
00051 UINT32 drop_lasterr;
00052
00053 return push_back(obj, drop_lasterr);
00054 }
00055
00056 bool CNQResponseWaitQueue::remove_elem( UINT16 requestid)
00057 {
00058 UINT32 drop_lasterr;
00059
00060 return remove_elem(requestid, drop_lasterr);
00061 }
00062
00063 bool CNQResponseWaitQueue::find_elem( UINT16 requestid, NQ_WAITFORRESPONSE &obj)
00064 {
00065 UINT32 drop_lasterr;
00066
00067 return find_elem(requestid, obj, drop_lasterr);
00068 }
00069
00070 bool CNQResponseWaitQueue::find_and_remove_elem( UINT16 requestid, NQ_WAITFORRESPONSE &obj)
00071 {
00072 UINT32 drop_lasterr;
00073
00074 bool ret = find_and_remove_elem(requestid, obj, drop_lasterr);
00075 return ret;
00076 }
00077
00078
00079
00080
00081
00082
00083
00084
00098 bool CNQResponseWaitQueue::push_back ( const NQ_WAITFORRESPONSE& obj, UINT32 &lasterr )
00099 {
00100 if (!lock())
00101 {
00102 m_iLastError = lasterr = ERR_RWQ_LOCK;
00103 return false;
00104 }
00105
00106 bool retval = false;
00107
00108
00109 if (m_iQueueNumElements >= m_iQueueMaxSize)
00110 {
00111 assert( m_iQueueNumElements == m_iQueueMaxSize );
00112 m_iLastError = lasterr = ERR_RWQ_FULL;
00113 }
00114 else
00115 {
00116 INT32 free_index = -1;
00117
00118 for (INT32 cur=0;cur<m_iQueueMaxSize;cur++)
00119 {
00120 if (m_pQueueValue[cur].enabled == 0)
00121 {
00122 free_index = cur;
00123 break;
00124 }
00125 }
00126
00127 assert( free_index != -1 );
00128
00129 if (m_iQueueLastElement == -1)
00130 {
00131
00132 m_iQueueFirstElement = free_index;
00133 m_iQueueLastElement = free_index;
00134 assert( m_pQueueValue[free_index].enabled == 0 );
00135 m_pQueueValue[free_index].enabled = 1;
00136 m_pQueueValue[free_index].wfr = obj;
00137
00138 m_iQueueNextElement[free_index] = -1;
00139 m_iQueueNumElements++;
00140 }
00141 else
00142 {
00143 m_iQueueNextElement[m_iQueueLastElement] = free_index;
00144 assert( m_pQueueValue[free_index].enabled == 0 );
00145 m_pQueueValue[free_index].enabled = 1;
00146 m_pQueueValue[free_index].wfr = obj;
00147
00148 m_iQueueNextElement[free_index] = -1;
00149 m_iQueueLastElement = free_index;
00150 m_iQueueNumElements++;
00151 }
00152
00153 m_iLastError = lasterr = ERR_RWQ_NONE;
00154 retval = true;
00155 }
00156
00157 unlock();
00158
00159 return retval;
00160 }
00161
00162
00163
00164
00181 bool CNQResponseWaitQueue::remove_elem( UINT16 requestid, UINT32 &lasterr )
00182 {
00183 if (!lock())
00184 {
00185 m_iLastError = lasterr = ERR_RWQ_LOCK;
00186 return false;
00187 }
00188
00189
00190 INT32 found_index = m_iQueueFirstElement;
00191 INT32 last_index = -1;
00192 bool del = false;
00193 bool retval = false;
00194
00195 while( found_index != -1)
00196 {
00197 assert( m_pQueueValue[found_index].enabled != 0);
00198
00199 if (m_pQueueValue[found_index].wfr.requestid == requestid)
00200 {
00201 if (last_index == -1)
00202 {
00203 INT32 removeidx = m_iQueueFirstElement;
00204
00205 m_pQueueValue[removeidx].enabled = 0;
00206 m_iQueueFirstElement = m_iQueueNextElement[removeidx];
00207 m_iQueueNumElements--;
00208
00209 if (m_iQueueNumElements == 0)
00210 {
00211 assert( m_iQueueFirstElement == -1 );
00212 m_iQueueLastElement = -1;
00213 }
00214
00215 del = true;
00216 }
00217 else
00218 {
00219 INT32 removeidx = found_index;
00220
00221 m_pQueueValue[removeidx].enabled = 0;
00222 m_iQueueNextElement[last_index] = m_iQueueNextElement[removeidx];
00223 m_iQueueNumElements--;
00224
00225 if (m_iQueueNextElement[last_index] == -1)
00226 {
00227 m_iQueueLastElement = last_index;
00228 }
00229
00230 del = true;
00231
00232 }
00233 }
00234
00235 if (del == true) break;
00236
00237 last_index = found_index;
00238 found_index = m_iQueueNextElement[found_index];
00239 }
00240
00241 if (del == true)
00242 {
00243 retval = true;
00244 m_iLastError = lasterr = ERR_RWQ_NONE;
00245 }
00246 else m_iLastError = lasterr = ERR_RWQ_NOTFOUND;
00247
00248
00249 unlock();
00250
00251 return retval;
00252 }
00253
00254
00255
00256
00257
00272 bool CNQResponseWaitQueue::find_elem( UINT16 requestid, NQ_WAITFORRESPONSE& obj, UINT32 &lasterr )
00273 {
00274 if (!lock())
00275 {
00276 m_iLastError = lasterr = ERR_RWQ_LOCK;
00277 return false;
00278 }
00279
00280 INT32 it = m_iQueueFirstElement;
00281 bool retval = false;
00282
00283 m_iLastError = lasterr = ERR_RWQ_NOTFOUND;
00284
00285 if (m_iQueueNumElements > 0)
00286 {
00287 while( it != -1)
00288 {
00289 assert( m_pQueueValue[it].enabled != 0);
00290 if (m_pQueueValue[it].wfr.requestid == requestid)
00291 {
00292 obj = m_pQueueValue[it].wfr;
00293 retval = true;
00294 m_iLastError = lasterr = ERR_RWQ_NONE;
00295 break;
00296 }
00297
00298 it = m_iQueueNextElement[it];
00299 }
00300 }
00301
00302 unlock();
00303
00304 return retval;
00305 }
00306
00307
00308
00309
00327 bool CNQResponseWaitQueue::find_and_remove_elem( UINT16 requestid, NQ_WAITFORRESPONSE& obj, UINT32 &lasterr )
00328 {
00329 if (!lock())
00330 {
00331 m_iLastError = lasterr = ERR_RWQ_LOCK;
00332 return false;
00333 }
00334
00335 INT32 found_index = m_iQueueFirstElement;
00336 INT32 last_index = -1;
00337 bool del = false;
00338 bool retval = false;
00339
00340 while( found_index != -1)
00341 {
00342 assert( m_pQueueValue[found_index].enabled != 0);
00343
00344 if (m_pQueueValue[found_index].wfr.requestid == requestid)
00345 {
00346 if (last_index == -1)
00347 {
00348 INT32 removeidx = m_iQueueFirstElement;
00349
00350 m_pQueueValue[removeidx].enabled = 0;
00351 obj = m_pQueueValue[removeidx].wfr;
00352
00353 m_iQueueFirstElement = m_iQueueNextElement[removeidx];
00354 m_iQueueNumElements--;
00355
00356 if (m_iQueueNumElements == 0)
00357 {
00358 assert( m_iQueueFirstElement == -1 );
00359 m_iQueueLastElement = -1;
00360 }
00361
00362 del = true;
00363 }
00364 else
00365 {
00366 INT32 removeidx = found_index;
00367
00368 m_pQueueValue[removeidx].enabled = 0;
00369 obj = m_pQueueValue[removeidx].wfr;
00370
00371 m_iQueueNextElement[last_index] = m_iQueueNextElement[removeidx];
00372 m_iQueueNumElements--;
00373
00374 if (m_iQueueNextElement[last_index] == -1)
00375 {
00376 m_iQueueLastElement = last_index;
00377 }
00378
00379 del = true;
00380
00381 }
00382 }
00383
00384 if (del == true) break;
00385
00386 last_index = found_index;
00387 found_index = m_iQueueNextElement[found_index];
00388 }
00389
00390 if (del == true) retval = true;
00391
00392 if (del == true)
00393 {
00394 retval = true;
00395 m_iLastError = lasterr = ERR_RWQ_NONE;
00396 }
00397 else m_iLastError = lasterr = ERR_RWQ_NOTFOUND;
00398
00399
00400 unlock();
00401
00402 return retval;
00403 }
00404
00406 UINT32 CNQResponseWaitQueue::size()
00407 {
00408 return( m_iQueueNumElements );
00409 }
00410
00416 UINT32 CNQResponseWaitQueue::getLastError()
00417 {
00418
00419 return( m_iLastError );
00420 }