requestHandler.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "requestHandler.h"
00019
00020 #include "lock.h"
00021 #include "scopedMutex.h"
00022 #include "idPool.h"
00023
00024 #include <eq/base/debug.h>
00025
00026 using namespace std;
00027
00028 namespace eq
00029 {
00030 namespace base
00031 {
00032 RequestHandler::RequestHandler( const bool threadSafe )
00033 : _mutex( threadSafe ? new Lock() : 0 ),
00034 _requestID( 1 )
00035 {}
00036
00037 RequestHandler::~RequestHandler()
00038 {
00039 while( !_freeRequests.empty( ))
00040 {
00041 Request* request = _freeRequests.front();
00042 _freeRequests.pop_front();
00043 delete request;
00044 }
00045
00046 delete _mutex;
00047 _mutex = 0;
00048 }
00049
00050 uint32_t RequestHandler::registerRequest( void* data )
00051 {
00052 ScopedMutex mutex( _mutex );
00053 if( !_mutex )
00054 CHECK_THREAD( _thread );
00055
00056 Request* request;
00057 if( _freeRequests.empty( ))
00058 request = new Request;
00059 else
00060 {
00061 request = _freeRequests.front();
00062 _freeRequests.pop_front();
00063 }
00064
00065 request->data = data;
00066 _requestID = ( _requestID + 1 ) % IDPool::MAX_CAPACITY;
00067 _requests[ _requestID ] = request;
00068
00069 return _requestID;
00070 }
00071
00072 void RequestHandler::unregisterRequest( const uint32_t requestID )
00073 {
00074 ScopedMutex mutex( _mutex );
00075 if( !_mutex )
00076 CHECK_THREAD( _thread );
00077
00078 RequestHash::iterator iter = _requests.find( requestID );
00079 if( iter == _requests.end( ))
00080 return;
00081
00082 Request* request = iter->second;
00083 _requests.erase( iter );
00084 _freeRequests.push_front( request );
00085
00086 if( _mutex )
00087 _mutex->unset();
00088 }
00089
00090 bool RequestHandler::waitRequest( const uint32_t requestID, void*& rPointer,
00091 const uint32_t timeout )
00092 {
00093 Request::Result result;
00094 if( !_waitRequest( requestID, result, timeout ))
00095 return false;
00096
00097 rPointer = result.rPointer;
00098 return true;
00099 }
00100 bool RequestHandler::waitRequest( const uint32_t requestID, uint32_t& rUint32,
00101 const uint32_t timeout )
00102 {
00103 Request::Result result;
00104 if( !_waitRequest( requestID, result, timeout ))
00105 return false;
00106
00107 rUint32 = result.rUint32;
00108 return true;
00109 }
00110 bool RequestHandler::waitRequest( const uint32_t requestID, bool& rBool,
00111 const uint32_t timeout )
00112 {
00113 Request::Result result;
00114 if( !_waitRequest( requestID, result, timeout ))
00115 return false;
00116
00117 rBool = result.rBool;
00118 return true;
00119 }
00120 bool RequestHandler::waitRequest( const uint32_t requestID )
00121 {
00122 Request::Result result;
00123 return _waitRequest( requestID, result, EQ_TIMEOUT_INDEFINITE );
00124 }
00125
00126 bool RequestHandler::_waitRequest( const uint32_t requestID,
00127 Request::Result& result,
00128 const uint32_t timeout )
00129 {
00130 if( _mutex ) _mutex->set();
00131 else CHECK_THREAD( _thread );
00132
00133 RequestHash::iterator iter = _requests.find( requestID );
00134 if( iter == _requests.end( ))
00135 {
00136 if( _mutex ) _mutex->unset();
00137 return false;
00138 }
00139
00140 Request* request = iter->second;
00141 if( _mutex ) _mutex->unset();
00142
00143 const bool requestServed = request->lock.set( timeout );
00144 if( requestServed )
00145 result = request->result;
00146
00147 ScopedMutex mutex( _mutex );
00148 iter = _requests.find( requestID );
00149 _requests.erase( iter );
00150 _freeRequests.push_front( request );
00151
00152 return requestServed;
00153 }
00154
00155 void* RequestHandler::getRequestData( const uint32_t requestID )
00156 {
00157 ScopedMutex mutex( _mutex );
00158 RequestHash::const_iterator i = _requests.find( requestID );
00159 if( i == _requests.end( ))
00160 return 0;
00161
00162 return i->second->data;
00163 }
00164
00165 void RequestHandler::serveRequest( const uint32_t requestID, void* result )
00166 {
00167 if( _mutex ) _mutex->set();
00168 RequestHash::const_iterator iter = _requests.find( requestID );
00169 EQASSERTINFO( iter != _requests.end(),
00170 "Attempt to serve unregistered request " << requestID );
00171
00172 Request* request = iter->second;
00173 if( _mutex ) _mutex->unset();
00174
00175 request->result.rPointer = result;
00176 request->lock.unset();
00177 }
00178 void RequestHandler::serveRequest( const uint32_t requestID, uint32_t result )
00179 {
00180 if( _mutex ) _mutex->set();
00181 RequestHash::const_iterator iter = _requests.find( requestID );
00182 EQASSERTINFO( iter != _requests.end(),
00183 "Attempt to serve unregistered request " << requestID );
00184
00185 Request* request = iter->second;
00186 if( _mutex ) _mutex->unset();
00187
00188 request->result.rUint32 = result;
00189 request->lock.unset();
00190 }
00191 void RequestHandler::serveRequest( const uint32_t requestID, bool result )
00192 {
00193 if( _mutex ) _mutex->set();
00194 RequestHash::const_iterator iter = _requests.find( requestID );
00195 EQASSERTINFO( iter != _requests.end(),
00196 "Attempt to serve unregistered request " << requestID );
00197
00198 Request* request = iter->second;
00199 if( _mutex ) _mutex->unset();
00200
00201 request->result.rBool = result;
00202 request->lock.unset();
00203 }
00204
00205 bool RequestHandler::isServed( const uint32_t requestID ) const
00206 {
00207 ScopedMutex mutex( _mutex );
00208 RequestHash::const_iterator iter = _requests.find( requestID );
00209 if( iter == _requests.end( ))
00210 return false;
00211
00212 Request* request = iter->second;
00213 if( !request->lock.isSet( ))
00214 return true;
00215
00216 return false;
00217 }
00218
00219 }
00220 }