CLOUD: Add RequestInfo struct
ConnectionManager upgrade: it now contains a special struct for each request, so you can access request status and data by request id.
This commit is contained in:
parent
eda575a660
commit
62ccf1f902
10 changed files with 117 additions and 21 deletions
|
@ -50,12 +50,16 @@ void ConnectionManager::registerEasyHandle(CURL *easy) {
|
|||
|
||||
int32 ConnectionManager::addRequest(Request *request) {
|
||||
int32 newId = _nextId++;
|
||||
_requests[newId] = request;
|
||||
_requests[newId] = RequestInfo(newId, request);
|
||||
request->setId(newId);
|
||||
if (!_timerStarted) startTimer();
|
||||
return newId;
|
||||
}
|
||||
|
||||
RequestInfo &ConnectionManager::getRequestInfo(int32 id) {
|
||||
return _requests[id];
|
||||
}
|
||||
|
||||
//private goes here:
|
||||
|
||||
void connectionsThread(void *ignored) {
|
||||
|
@ -87,15 +91,34 @@ void ConnectionManager::handle() {
|
|||
void ConnectionManager::interateRequests() {
|
||||
//call handle() of all running requests (so they can do their work)
|
||||
debug("handling %d request(s)", _requests.size());
|
||||
for (Common::HashMap<int32, Request *>::iterator i = _requests.begin(); i != _requests.end();) {
|
||||
Request *request = i->_value;
|
||||
if (request && request->handle()) {
|
||||
delete request;
|
||||
//_requests.erase(i);
|
||||
_requests[i->_key] = 0;
|
||||
++i; //that's temporary
|
||||
} else ++i;
|
||||
Common::Array<int32> idsToRemove;
|
||||
for (Common::HashMap<int32, RequestInfo>::iterator i = _requests.begin(); i != _requests.end(); ++i) {
|
||||
RequestInfo &info = _requests[i->_key];
|
||||
|
||||
switch(info.state) {
|
||||
case FINISHED:
|
||||
delete info.request;
|
||||
info.request = 0;
|
||||
idsToRemove.push_back(info.id);
|
||||
break;
|
||||
|
||||
case PROCESSING:
|
||||
info.request->handle();
|
||||
break;
|
||||
|
||||
case RETRY:
|
||||
if (info.retryInSeconds > 0) --info.retryInSeconds;
|
||||
else {
|
||||
info.state = PROCESSING;
|
||||
info.request->restart();
|
||||
}
|
||||
|
||||
default:
|
||||
; //nothing to do
|
||||
}
|
||||
}
|
||||
for (uint32 i = 0; i < idsToRemove.size(); ++i)
|
||||
_requests.erase(idsToRemove[i]);
|
||||
if (_requests.empty()) stopTimer();
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue