00001 #ifndef __RESPONSEWAITQUEUE_H_INCLUDED__ 00002 #define __RESPONSEWAITQUEUE_H_INCLUDED__ 00003 00004 #include "Platform.h" 00005 #include "LockMechanism.h" 00006 #include "Declarations.h" 00007 00008 typedef struct 00009 { 00010 UINT16 enabled; 00011 WAITFORRESPONSE wfr; 00012 } WAITFORRESPONSEINT; 00013 00014 00015 /* 00016 CResponseWaitQueue - SW (Nov 2006 to Mar 2007) 00017 00018 Implementation of platform (and stack) independent FIFO packet queue for structs of type 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 CResponseWaitQueue 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 CResponseWaitQueue : public CLockMechanism 00033 { // FIFO style 00034 public: 00035 CResponseWaitQueue(); 00036 virtual ~CResponseWaitQueue(); 00037 00038 UINT32 getLastError(); 00039 00040 // convenience 00041 bool push_back ( const WAITFORRESPONSE& obj); 00042 bool remove_elem( UINT16 requestid); 00043 bool find_elem( UINT16 requestid, WAITFORRESPONSE& obj); 00044 bool find_and_remove_elem( UINT16 requestid, WAITFORRESPONSE& obj); 00045 00046 // low level 00047 bool push_back ( const WAITFORRESPONSE& obj, UINT32 &lasterr ); 00048 bool remove_elem( UINT16 requestid, UINT32 &lasterr ); 00049 bool find_elem( UINT16 requestid, WAITFORRESPONSE& obj, UINT32 &lasterr ); 00050 bool find_and_remove_elem( UINT16 requestid, 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 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 // __RESPONSEWAITQUEUE_H_INCLUDED__