#include <request.h>
Public Member Functions | |
CRequestManager () | |
~CRequestManager () | |
int | Initialize (const unsigned int nRequests, const unsigned int BufferSize) |
void | Free (StrRequest *Request) |
StrRequest * | New () |
StrRequest * | Get (const u32 ReqId) |
Private Attributes | |
unsigned int | m_n |
CRioFreeList | m_FreeList |
StrRequest * | m_Request |
CBufferManager | m_BufferManager |
Definition at line 96 of file request.h.
CRequestManager::CRequestManager | ( | ) |
Definition at line 64 of file request.cpp.
CRequestManager::~CRequestManager | ( | ) |
Definition at line 70 of file request.cpp.
void CRequestManager::Free | ( | StrRequest * | Request | ) |
Definition at line 131 of file request.cpp.
00132 { 00133 // Higher order 16 bits are version number, incremented every time 00134 // request is free. Lower order 16 bits are index to 00135 // vector m_Request 00136 00137 //RioErr << "Free request: (before): " << (void *) Request->Id << endl; 00138 00139 u32 Version = ((Request->Id & 0xffff0000) >> 16 ); 00140 Version ++; 00141 u32 Ind = Request->Id & 0xffff; 00142 Request->Id = Ind | (Version << 16); 00143 Request->Status = RequestStatusFree; 00144 00145 00146 //RioErr << "Version: " << (void*) Version << endl; 00147 //RioErr << "Free request: (after): " << (void*) Request->Id << endl; 00148 00149 m_FreeList.Free( (RioQueueEle*)Request); 00150 }
StrRequest * CRequestManager::Get | ( | const u32 | ReqId | ) |
Definition at line 166 of file request.cpp.
00167 { 00168 StrRequest* rp; 00169 00170 // lower 16 bits are index to vector m_Request; 00171 unsigned int ind = ReqId & 0xffff; 00172 00173 if(ind >= m_n) 00174 return 0; 00175 00176 rp = &m_Request[ind]; 00177 00178 // Request must be in use and Request Id version must match 00179 if( (rp->Status != RequestStatusFree) && (rp->Id == ReqId) ) 00180 return rp; 00181 else 00182 return 0; 00183 }
int CRequestManager::Initialize | ( | const unsigned int | nRequests, | |
const unsigned int | BufferSize | |||
) |
Definition at line 79 of file request.cpp.
00081 { 00082 00083 // debug ----------------------------------------------- 00084 RioErr << "RequestManager: Max number = " << 0xffff << endl; 00085 RioErr << "RequestManager: Using = "<< nRequest << endl; 00086 // ------------------------------------------------------------------------ 00087 00088 // Request index has to fit in 16 bits 00089 if( ( nRequest <= 0 ) || ( nRequest > 0xffff )) 00090 { 00091 return ERROR_SS_PROGRAM_ERROR; 00092 } 00093 00094 // In case was initialized before 00095 if(m_Request != 0) 00096 { 00097 delete[] m_Request; 00098 m_n = 0; 00099 } 00100 00101 m_Request = new StrRequest[nRequest]; 00102 00103 if( m_Request == 0 ) 00104 return ERROR_SS_MEMORY; 00105 00106 m_n = nRequest; 00107 00108 int stat = m_BufferManager.Initialize( nRequest,BufferSize ); 00109 00110 if(stat < 0) 00111 { 00112 delete[] m_Request; 00113 return stat; 00114 } 00115 00116 for( int i= ((int)(nRequest))-1; i>=0; i-- ) 00117 { 00118 m_Request[i].Status = RequestStatusFree; 00119 m_Request[i].Id = i; 00120 m_Request[i].Buffer = m_BufferManager.New(); 00121 m_Request[i].Data = m_Request[i].Buffer->Data; 00122 m_FreeList.Free((RioQueueEle*)&m_Request[i]); 00123 } 00124 00125 return (0); 00126 00127 }
StrRequest * CRequestManager::New | ( | ) |
Definition at line 155 of file request.cpp.
00156 { 00157 StrRequest* rp; 00158 00159 rp = (StrRequest*) m_FreeList.GetNB(); 00160 00161 return rp; 00162 }
CRioFreeList CRequestManager::m_FreeList [private] |
unsigned int CRequestManager::m_n [private] |
StrRequest* CRequestManager::m_Request [private] |