00001 #ifndef __NQRESPONSEWAITQUEUE_H_INCLUDED__ 00002 #define __NQRESPONSEWAITQUEUE_H_INCLUDED__ 00003 00004 #include "PlatformSW.h" 00005 #include "NQLockMechanism.h" 00006 #include "NQDeclarations.h" 00007 00008 typedef struct 00009 { 00010 UINT16 enabled; 00011 NQ_WAITFORRESPONSE wfr; 00012 } NQ_WAITFORRESPONSEINT; 00013 00014 00015 /* 00016 CNQResponseWaitQueue - SW (Nov 2006 to Mar 2007) 00017 00018 Implementation of platform (and stack) independent FIFO packet queue for structs of type NQ_WAITFORRESPONSE. 00019 This special queue is required for synchronous calls (CNetworkQueue::SendRequestAndWaitForResponse()). 00020 00021 Using C++ STL this could be done much more easily, but implementation on Nios2 platform did not work 00022 (reason not fully known, stack issues suspected). This CNQResponseWaitQueue was created as a slightly inferior, 00023 but working solution. 00024 00025 Implementation details: 00026 - double array linked list 00027 - access protected by binary semaphore or mutex object 00028 00029 */ 00030 00031 00032 class CNQResponseWaitQueue : public CNQLockMechanism 00033 { // FIFO style 00034 public: 00035 CNQResponseWaitQueue(); 00036 virtual ~CNQResponseWaitQueue(); 00037 00038 UINT32 getLastError(); 00039 00040 // convenience 00041 bool push_back ( const NQ_WAITFORRESPONSE& obj); 00042 bool remove_elem( UINT16 requestid); 00043 bool find_elem( UINT16 requestid, NQ_WAITFORRESPONSE& obj); 00044 bool find_and_remove_elem( UINT16 requestid, NQ_WAITFORRESPONSE& obj); 00045 00046 // low level 00047 bool push_back ( const NQ_WAITFORRESPONSE& obj, UINT32 &lasterr ); 00048 bool remove_elem( UINT16 requestid, UINT32 &lasterr ); 00049 bool find_elem( UINT16 requestid, NQ_WAITFORRESPONSE& obj, UINT32 &lasterr ); 00050 bool find_and_remove_elem( UINT16 requestid, NQ_WAITFORRESPONSE& obj, UINT32 &lasterr ); 00051 00052 UINT32 size(); 00053 00054 private: 00055 INT32 m_iQueueFirstElement; // -1 == no first element 00056 INT32 m_iQueueLastElement; // -1 == no last element 00057 INT32 m_iQueueNumElements; // elements contained inside 00058 00059 NQ_WAITFORRESPONSEINT *m_pQueueValue; // elements (0 == empty) 00060 INT32 *m_iQueueNextElement; // ptr to next element 00061 00062 INT32 m_iQueueMaxSize; // maximum number of elements 00063 00064 UINT32 m_iLastError; // last error that happened inside 00065 }; 00066 00067 00068 00069 #endif // __NQRESPONSEWAITQUEUE_H_INCLUDED__