00001 #define __NQ_INTERNAL_SW__
00002
00003 #include "PlatformSW.h"
00004 #include "NQDeclarations.h"
00005 #include "NQPacketQueue.h"
00006 #include <assert.h>
00007
00008
00009
00010
00011
00012
00013
00014 CNQPacketQueue::CNQPacketQueue() : CNQLockMechanism()
00015 {
00016 INT32 maxsize = NQ_DEFAULT_PACKETQUEUE_SIZE;
00017 m_iQueueMaxSize = maxsize;
00018 m_iLastError = ERR_PQ_NONE;
00019
00020 m_pQueueValue = new VOIDP[maxsize];
00021 m_iQueueNextElement = new INT32[maxsize];
00022
00023 for (INT32 i=0;i<maxsize;i++)
00024 {
00025 m_pQueueValue[i] = NULL;
00026 m_iQueueNextElement[i] = -1;
00027 }
00028
00029 m_iQueueFirstElement = -1;
00030 m_iQueueLastElement = -1;
00031 m_iQueueNumElements = 0;
00032 }
00033
00034
00035
00036
00037
00038
00039 CNQPacketQueue::~CNQPacketQueue()
00040 {
00041 delete [] m_pQueueValue;
00042 delete [] m_iQueueNextElement;
00043 }
00044
00045
00046
00047
00048
00049 bool CNQPacketQueue::setQueueMaxsize( INT32 maxsize )
00050 {
00051 UINT32 drop_lasterr;
00052
00053 return setQueueMaxsize(maxsize, drop_lasterr);
00054 }
00055
00056 bool CNQPacketQueue::pop_front( CNQMessage **obj )
00057 {
00058 UINT32 drop_lasterr;
00059
00060 return pop_front(obj, drop_lasterr);
00061 }
00062
00063 bool CNQPacketQueue::push_back( const CNQMessage* obj)
00064 {
00065 UINT32 drop_lasterr;
00066
00067 return push_back(obj, drop_lasterr);
00068 }
00069
00070 bool CNQPacketQueue::remove_elem( UINT16 requestid)
00071 {
00072 UINT32 drop_lasterr;
00073
00074 return remove_elem(requestid, drop_lasterr);
00075 }
00076
00077 bool CNQPacketQueue::find_elem( UINT16 requestid, CNQMessage ** obj)
00078 {
00079 UINT32 drop_lasterr;
00080
00081 return find_elem(requestid, obj, drop_lasterr);
00082 }
00083
00084 bool CNQPacketQueue::find_and_remove_elem( UINT16 requestid, CNQMessage **obj)
00085 {
00086 UINT32 drop_lasterr;
00087
00088 return find_and_remove_elem(requestid, obj, drop_lasterr);
00089 }
00090
00091 bool CNQPacketQueue::find_elem_ack_and_signal( const CNQMessage &aAckPacket)
00092 {
00093 UINT32 drop_lasterr;
00094
00095 return find_elem_ack_and_signal( aAckPacket, drop_lasterr);
00096 }
00097
00098 bool CNQPacketQueue::find_and_remove_passed_elem( CNQMessage *obj)
00099 {
00100 UINT32 drop_lasterr;
00101
00102 return find_and_remove_passed_elem( obj, drop_lasterr);
00103 }
00104
00105
00106
00107
00108
00109
00124 bool CNQPacketQueue::setQueueMaxsize( INT32 maxsize, UINT32 &lasterr )
00125 {
00126 if (!lock())
00127 {
00128 m_iLastError = lasterr = ERR_PQ_LOCK;
00129 return false;
00130 }
00131
00132 delete [] m_pQueueValue;
00133 delete [] m_iQueueNextElement;
00134
00135 m_iQueueMaxSize = maxsize;
00136 m_pQueueValue = new VOIDP[maxsize];
00137 m_iQueueNextElement = new INT32[maxsize];
00138
00139 for (INT32 i=0;i<maxsize;i++)
00140 {
00141 m_pQueueValue[i] = NULL;
00142 m_iQueueNextElement[i] = -1;
00143 }
00144
00145 m_iQueueFirstElement = -1;
00146 m_iQueueLastElement = -1;
00147 m_iQueueNumElements = 0;
00148
00149 unlock();
00150
00151 m_iLastError = lasterr = ERR_PQ_NONE;
00152 return true;
00153 }
00154
00155
00156
00157
00158
00177 bool CNQPacketQueue::pop_front( CNQMessage **obj, UINT32 &lasterr )
00178 {
00179 bool retval = false;
00180
00181 if (obj == NULL)
00182 {
00183 m_iLastError = lasterr = ERR_PQ_BADPARAM;
00184 return false;
00185 }
00186
00187 if (!lock())
00188 {
00189 m_iLastError = lasterr = ERR_PQ_LOCK;
00190 return false;
00191 }
00192
00193 if (m_iQueueNumElements != 0)
00194 {
00195 INT32 removeidx = m_iQueueFirstElement;
00196
00197 *obj = (CNQMessage *) m_pQueueValue[removeidx];
00198
00199 m_pQueueValue[removeidx] = NULL;
00200 m_iQueueFirstElement = m_iQueueNextElement[removeidx];
00201 m_iQueueNumElements--;
00202
00203 if (m_iQueueNumElements == 0)
00204 {
00205 assert( m_iQueueFirstElement == -1 );
00206 m_iQueueLastElement = -1;
00207 }
00208
00209 retval = true;
00210 }
00211
00212 unlock();
00213
00214 m_iLastError = lasterr = ERR_PQ_NONE;
00215 return retval;
00216 }
00217
00218
00219
00220
00239 bool CNQPacketQueue::push_back ( const CNQMessage *obj, UINT32 &lasterr )
00240 {
00241 bool retval = false;
00242
00243 if (obj == NULL)
00244 {
00245 m_iLastError = lasterr = ERR_PQ_BADPARAM;
00246 return false;
00247 }
00248
00249 if (!lock())
00250 {
00251 m_iLastError = lasterr = ERR_PQ_LOCK;
00252 return false;
00253 }
00254
00255
00256 if (m_iQueueNumElements >= m_iQueueMaxSize)
00257 {
00258 assert( m_iQueueNumElements == m_iQueueMaxSize );
00259 m_iLastError = lasterr = ERR_PQ_FULL;
00260 }
00261 else
00262 {
00263 INT32 free_index = -1;
00264
00265 for (INT32 cur=0;cur<m_iQueueMaxSize;cur++)
00266 {
00267 if (m_pQueueValue[cur] == NULL)
00268 {
00269 free_index = cur;
00270 break;
00271 }
00272 }
00273
00274 assert( free_index != -1 );
00275
00276 if (m_iQueueLastElement == -1)
00277 {
00278
00279 m_iQueueFirstElement = free_index;
00280 m_iQueueLastElement = free_index;
00281 assert( m_pQueueValue[free_index] == NULL );
00282 m_pQueueValue[free_index] = (VOIDP) obj;
00283 m_iQueueNextElement[free_index] = -1;
00284 m_iQueueNumElements++;
00285 }
00286 else
00287 {
00288 m_iQueueNextElement[m_iQueueLastElement] = free_index;
00289 assert( m_pQueueValue[free_index] == NULL );
00290 m_pQueueValue[free_index] = (VOIDP) obj;
00291 m_iQueueNextElement[free_index] = -1;
00292 m_iQueueLastElement = free_index;
00293 m_iQueueNumElements++;
00294 }
00295
00296 m_iLastError = lasterr = ERR_PQ_NONE;
00297 retval = true;
00298 }
00299
00300 unlock();
00301
00302 return retval;
00303 }
00304
00305
00306
00307
00327 bool CNQPacketQueue::remove_elem( UINT16 requestid, UINT32 &lasterr )
00328 {
00329 if (!lock())
00330 {
00331 m_iLastError = lasterr = ERR_PQ_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 CNQMessage *obj = (CNQMessage *) m_pQueueValue[found_index];
00343
00344 if (obj->internalRequestID == requestid)
00345 {
00346 if (last_index == -1)
00347 {
00348 INT32 removeidx = m_iQueueFirstElement;
00349
00350 m_pQueueValue[removeidx] = NULL;
00351 m_iQueueFirstElement = m_iQueueNextElement[removeidx];
00352 m_iQueueNumElements--;
00353
00354 if (m_iQueueNumElements == 0)
00355 {
00356 assert( m_iQueueFirstElement == -1 );
00357 m_iQueueLastElement = -1;
00358 }
00359
00360 del = true;
00361 }
00362 else
00363 {
00364 INT32 removeidx = found_index;
00365
00366 m_pQueueValue[removeidx] = NULL;
00367 m_iQueueNextElement[last_index] = m_iQueueNextElement[removeidx];
00368 m_iQueueNumElements--;
00369
00370 if (m_iQueueNextElement[last_index] == -1)
00371 {
00372 m_iQueueLastElement = last_index;
00373 }
00374
00375 del = true;
00376
00377 }
00378 }
00379
00380 if (del == true) break;
00381
00382 last_index = found_index;
00383 found_index = m_iQueueNextElement[found_index];
00384 }
00385
00386 if (del == true)
00387 {
00388 retval = true;
00389 m_iLastError = lasterr = ERR_PQ_NONE;
00390 }
00391 else m_iLastError = lasterr = ERR_PQ_NOTFOUND;
00392
00393 unlock();
00394
00395 return retval;
00396 }
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00428 bool CNQPacketQueue::find_elem( UINT16 requestid, CNQMessage **obj, UINT32 &lasterr )
00429 {
00430 if (obj == NULL)
00431 {
00432 m_iLastError = lasterr = ERR_PQ_BADPARAM;
00433 return false;
00434 }
00435
00436 if (!lock())
00437 {
00438 m_iLastError = lasterr = ERR_PQ_LOCK;
00439 return false;
00440 }
00441
00442 INT32 it = m_iQueueFirstElement;
00443 bool retval = false;
00444
00445 m_iLastError = lasterr = ERR_PQ_NOTFOUND;
00446
00447 if (m_iQueueNumElements > 0)
00448 {
00449 while( it != -1)
00450 {
00451 CNQMessage *intobj = (CNQMessage *) m_pQueueValue[it];
00452 if (intobj->internalRequestID == requestid)
00453 {
00454 *obj = intobj;
00455 retval = true;
00456 m_iLastError = lasterr = ERR_PQ_NONE;
00457 break;
00458 }
00459
00460 it = m_iQueueNextElement[it];
00461 }
00462 }
00463
00464 unlock();
00465
00466 return retval;
00467 }
00468
00469
00470
00471
00495 bool CNQPacketQueue::find_elem_ack_and_signal( const CNQMessage &ack_packet, UINT32 &lasterr )
00496 {
00497 if (ack_packet.isAckPacket() == false)
00498 {
00499 m_iLastError = lasterr = ERR_PQ_BADPARAM;
00500 return false;
00501 }
00502
00503 if (!lock())
00504 {
00505 m_iLastError = lasterr = ERR_PQ_LOCK;
00506 return false;
00507 }
00508
00509 INT32 it = m_iQueueFirstElement;
00510 bool retval = false;
00511
00512 m_iLastError = lasterr = ERR_PQ_NOTFOUND;
00513
00514 if (m_iQueueNumElements > 0)
00515 {
00516 while( it != -1)
00517 {
00518 CNQMessage *intobj = (CNQMessage *) m_pQueueValue[it];
00519 if (intobj->matchAckPacket( ack_packet ) == true )
00520 {
00521 bool signalAckSemaphoreSuccessful = platformSignalSemaphore( intobj->notifySemaphoreOnReceiveAck );
00522 assert( signalAckSemaphoreSuccessful == true );
00523 signalAckSemaphoreSuccessful=signalAckSemaphoreSuccessful;
00524
00525 retval = true;
00526 m_iLastError = lasterr = ERR_PQ_NONE;
00527 break;
00528 }
00529
00530 it = m_iQueueNextElement[it];
00531 }
00532 }
00533
00534 unlock();
00535
00536 return retval;
00537 }
00538
00539
00540
00541
00542
00564 bool CNQPacketQueue::find_and_remove_passed_elem( CNQMessage *obj, UINT32 &lasterr )
00565 {
00566 if (obj == NULL)
00567 {
00568 m_iLastError = lasterr = ERR_PQ_BADPARAM;
00569 return false;
00570 }
00571
00572 if (!lock())
00573 {
00574 m_iLastError = lasterr = ERR_PQ_LOCK;
00575 return false;
00576 }
00577
00578 INT32 found_index = m_iQueueFirstElement;
00579 INT32 last_index = -1;
00580 bool del = false;
00581 bool retval = false;
00582
00583 while( found_index != -1)
00584 {
00585 CNQMessage *intobj = (CNQMessage *) m_pQueueValue[found_index];
00586
00587 if (intobj == obj)
00588 {
00589 if (last_index == -1)
00590 {
00591 INT32 removeidx = m_iQueueFirstElement;
00592
00593 m_pQueueValue[removeidx] = NULL;
00594 m_iQueueFirstElement = m_iQueueNextElement[removeidx];
00595 m_iQueueNumElements--;
00596
00597 if (m_iQueueNumElements == 0)
00598 {
00599 assert( m_iQueueFirstElement == -1 );
00600 m_iQueueLastElement = -1;
00601 }
00602
00603 del = true;
00604 }
00605 else
00606 {
00607 INT32 removeidx = found_index;
00608
00609 m_pQueueValue[removeidx] = NULL;
00610 m_iQueueNextElement[last_index] = m_iQueueNextElement[removeidx];
00611 m_iQueueNumElements--;
00612
00613 if (m_iQueueNextElement[last_index] == -1)
00614 {
00615 m_iQueueLastElement = last_index;
00616 }
00617
00618 del = true;
00619
00620 }
00621 }
00622
00623 if (del == true) break;
00624
00625 last_index = found_index;
00626 found_index = m_iQueueNextElement[found_index];
00627 }
00628
00629 if (del == true)
00630 {
00631 retval = true;
00632 m_iLastError = lasterr = ERR_PQ_NONE;
00633 }
00634 else m_iLastError = lasterr = ERR_PQ_NOTFOUND;
00635
00636 unlock();
00637
00638 return retval;
00639
00640 }
00641
00642
00643
00644
00666 bool CNQPacketQueue::find_and_remove_elem( UINT16 requestid, CNQMessage **obj, UINT32 &lasterr )
00667 {
00668 if (obj == NULL)
00669 {
00670 m_iLastError = lasterr = ERR_PQ_BADPARAM;
00671 return false;
00672 }
00673
00674 if (!lock())
00675 {
00676 m_iLastError = lasterr = ERR_PQ_LOCK;
00677 return false;
00678 }
00679
00680 INT32 found_index = m_iQueueFirstElement;
00681 INT32 last_index = -1;
00682 bool del = false;
00683 bool retval = false;
00684
00685 while( found_index != -1)
00686 {
00687 CNQMessage *intobj = (CNQMessage *) m_pQueueValue[found_index];
00688
00689 if (intobj->internalRequestID == requestid)
00690 {
00691 if (last_index == -1)
00692 {
00693 INT32 removeidx = m_iQueueFirstElement;
00694 *obj = intobj;
00695 m_pQueueValue[removeidx] = NULL;
00696 m_iQueueFirstElement = m_iQueueNextElement[removeidx];
00697 m_iQueueNumElements--;
00698
00699 if (m_iQueueNumElements == 0)
00700 {
00701 assert( m_iQueueFirstElement == -1 );
00702 m_iQueueLastElement = -1;
00703 }
00704
00705 del = true;
00706 }
00707 else
00708 {
00709 INT32 removeidx = found_index;
00710
00711 *obj = intobj;
00712 m_pQueueValue[removeidx] = NULL;
00713 m_iQueueNextElement[last_index] = m_iQueueNextElement[removeidx];
00714 m_iQueueNumElements--;
00715
00716 if (m_iQueueNextElement[last_index] == -1)
00717 {
00718 m_iQueueLastElement = last_index;
00719 }
00720
00721 del = true;
00722
00723 }
00724 }
00725
00726 if (del == true) break;
00727
00728 last_index = found_index;
00729 found_index = m_iQueueNextElement[found_index];
00730 }
00731
00732 if (del == true)
00733 {
00734 retval = true;
00735 m_iLastError = lasterr = ERR_PQ_NONE;
00736 }
00737 else m_iLastError = lasterr = ERR_PQ_NOTFOUND;
00738
00739 unlock();
00740
00741 return retval;
00742
00743 }
00744
00745
00746
00747
00748
00756 int CNQPacketQueue::size()
00757 {
00758 return (m_iQueueNumElements);
00759 }
00760
00768 UINT32 CNQPacketQueue::getLastError()
00769 {
00770
00771 return( m_iLastError );
00772 }