#include <diskrequest.h>
Public Member Functions | |
CDiskRequestManager () | |
~CDiskRequestManager () | |
int | Initialize (const unsigned int nDiskRequests) |
void | Free (StrDiskRequest *DiskRequest) |
StrDiskRequest * | New () |
StrDiskRequest * | Get (const u32 ReqId) |
Private Attributes | |
unsigned int | m_n |
CDiskRequestQueue | m_FreeList |
StrDiskRequest * | m_DiskRequest |
Definition at line 69 of file diskrequest.h.
CDiskRequestManager::CDiskRequestManager | ( | ) |
Definition at line 57 of file diskrequest.cpp.
00058 { 00059 m_n = 0; 00060 // m_FreeList does not need to be initialized 00061 m_DiskRequest = 0; 00062 }
CDiskRequestManager::~CDiskRequestManager | ( | ) |
Definition at line 64 of file diskrequest.cpp.
00065 { 00066 if( m_DiskRequest != 0 ) 00067 { 00068 delete[] m_DiskRequest; 00069 } 00070 }
void CDiskRequestManager::Free | ( | StrDiskRequest * | DiskRequest | ) |
Definition at line 107 of file diskrequest.cpp.
00108 { 00109 // Higher order 16 bits are version number, incremented every time 00110 // request is free. Lower order 16 bits are index to 00111 // vector m_DiskRequest 00112 00113 u32 Version = (( DiskRequest->Id & 0xffff0000 ) >> 16 ); 00114 Version ++; 00115 u32 Ind = DiskRequest->Id & 0xffff; 00116 DiskRequest->Id = Ind | ( Version << 16 ); 00117 DiskRequest->Status = DiskRequestStatusFree; 00118 00119 m_FreeList.Put( DiskRequest ); 00120 }
StrDiskRequest * CDiskRequestManager::Get | ( | const u32 | ReqId | ) |
Definition at line 141 of file diskrequest.cpp.
00142 { 00143 StrDiskRequest* rp; 00144 00145 // lower 16 bits are index to vector m_DiskRequest; 00146 u32 ind = ReqId & 0xffff; 00147 00148 if( ind >= m_n ) 00149 return 0; 00150 00151 rp = &m_DiskRequest[ind]; 00152 00153 // Request must be in use and Request Id version must match 00154 if( ( rp->Status != DiskRequestStatusFree ) && ( rp->Id == ReqId ) ) 00155 return rp; 00156 else 00157 return 0; 00158 }
int CDiskRequestManager::Initialize | ( | const unsigned int | nDiskRequests | ) |
Definition at line 73 of file diskrequest.cpp.
00074 { 00075 // Request index has to fit in 16 bits 00076 if( ( nDiskRequest <= 0 ) || ( nDiskRequest > 0xffff ) ) 00077 { 00078 return ERROR_ROUTER + ERROR_INVALID_PARAM; 00079 } 00080 00081 // In case was initialized before 00082 if( m_DiskRequest != 0 ) 00083 { 00084 delete[] m_DiskRequest; 00085 m_n = 0; 00086 } 00087 00088 m_DiskRequest = new StrDiskRequest[nDiskRequest]; 00089 00090 if( m_DiskRequest == 0 ) 00091 return ERROR_ROUTER + ERROR_MEMORY; 00092 00093 m_n = nDiskRequest; 00094 00095 for( int i = ((int)( nDiskRequest )) - 1; i >= 0; i-- ) 00096 { 00097 m_DiskRequest[i].Status = DiskRequestStatusFree; 00098 m_DiskRequest[i].Id = i; 00099 m_FreeList.Put( &m_DiskRequest[i] ); 00100 } 00101 00102 return (0); 00103 }
StrDiskRequest * CDiskRequestManager::New | ( | ) |
Definition at line 125 of file diskrequest.cpp.
00126 { 00127 StrDiskRequest* rp; 00128 00129 rp = ( StrDiskRequest* ) m_FreeList.Get(); 00130 00131 if( rp !=0 ) 00132 { 00133 rp->Status = DiskRequestStatusInUse; 00134 } 00135 00136 return rp; 00137 }
StrDiskRequest* CDiskRequestManager::m_DiskRequest [private] |
Definition at line 85 of file diskrequest.h.
Definition at line 84 of file diskrequest.h.
unsigned int CDiskRequestManager::m_n [private] |
Definition at line 83 of file diskrequest.h.