From 8ba127d4c5d141218ff35c223a75fbe036615dcd Mon Sep 17 00:00:00 2001 From: Aleric Inglewood Date: Mon, 15 Oct 2012 21:07:17 +0200 Subject: [PATCH] HTTPTimeout work in progress * Avoid using CurlEasyRequest::mTimeout for HTTPTime::done and HTTPTime::print_diagnostics when it might be NULL. * Comment fixes. * Indentation fix. --- indra/aistatemachine/aicurl.cpp | 13 +++++++++++++ indra/aistatemachine/aicurlprivate.h | 17 ++++++++++++++--- indra/aistatemachine/aicurlthread.cpp | 11 +++++------ 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/indra/aistatemachine/aicurl.cpp b/indra/aistatemachine/aicurl.cpp index f4d65c49e..40d417007 100644 --- a/indra/aistatemachine/aicurl.cpp +++ b/indra/aistatemachine/aicurl.cpp @@ -1260,6 +1260,19 @@ void CurlEasyRequest::removed_from_multi_handle(AICurlEasyRequest_wat& curl_easy mEventsTarget->removed_from_multi_handle(curl_easy_request_w); } +void CurlEasyRequest::print_diagnostics(AICurlEasyRequest_wat const& curlEasyRequest_w, CURLcode code) +{ + if (code == CURLE_OPERATION_TIMEDOUT) + { + // mTimeout SHOULD always be set, but I see no reason not to test it, as + // this is far from the code that guaranteeds that it is set. + if (mTimeout) + { + mTimeout->print_diagnostics(curlEasyRequest_w); + } + } +} + //----------------------------------------------------------------------------- // CurlResponderBuffer diff --git a/indra/aistatemachine/aicurlprivate.h b/indra/aistatemachine/aicurlprivate.h index dc244da42..b4741eca0 100644 --- a/indra/aistatemachine/aicurlprivate.h +++ b/indra/aistatemachine/aicurlprivate.h @@ -337,11 +337,22 @@ class CurlEasyRequest : public CurlEasyHandle { void set_timeout_opts(void); public: - // Called by MultiHandle::check_run_count() to store result code that is returned by getResult. + // Called by MultiHandle::finish_easy_request() to store result code that is returned by getResult. void storeResult(CURLcode result) { mResult = result; } - // Called by MultiHandle::check_run_count() when the curl easy handle is done. - void done(AICurlEasyRequest_wat& curl_easy_request_w) { finished(curl_easy_request_w); } + // Called by MultiHandle::finish_easy_request() when the curl easy handle is done. + void done(AICurlEasyRequest_wat& curl_easy_request_w, CURLcode result) + { + if (mTimeout) + { + // Update timeout administration. + mTimeout->done(curl_easy_request_w, result); + } + finished(curl_easy_request_w); + } + + // Called by in case of an error. + void print_diagnostics(AICurlEasyRequest_wat const& curlEasyRequest_w, CURLcode code); // Called by MultiHandle::check_run_count() to fill info with the transfer info. void getTransferInfo(AICurlInterface::TransferInfo* info); diff --git a/indra/aistatemachine/aicurlthread.cpp b/indra/aistatemachine/aicurlthread.cpp index a973e4260..22925613c 100644 --- a/indra/aistatemachine/aicurlthread.cpp +++ b/indra/aistatemachine/aicurlthread.cpp @@ -1713,10 +1713,8 @@ void MultiHandle::finish_easy_request(AICurlEasyRequest const& easy_request, CUR Dout(dc::finish, "pretransfer_time: " << pretransfer_time << ", starttransfer_time: " << starttransfer_time << ". [CURLINFO_PRIVATE = " << (void*)easy_request.get_ptr().get() << "]"); #endif - // Update timeout administration. - curl_easy_request_w->httptimeout()->done(curl_easy_request_w, result); // Signal that this easy handle finished. - curl_easy_request_w->done(curl_easy_request_w); + curl_easy_request_w->done(curl_easy_request_w, result); } //----------------------------------------------------------------------------- @@ -2096,13 +2094,14 @@ void CurlResponderBuffer::processOutput(AICurlEasyRequest_wat& curl_easy_request curl_easy_request_w->setopt(CURLOPT_FRESH_CONNECT, TRUE); } + llassert(mResponder); // AIFIXME: We always have a responder now, no? if (mResponder) { - if (code == CURLE_OPERATION_TIMEDOUT) + if (code != CURLE_OK) { - curl_easy_request_w->httptimeout()->print_diagnostics(curl_easy_request_w); + curl_easy_request_w->print_diagnostics(curl_easy_request_w, code); } - if (mEventsTarget) + if (mEventsTarget) { // Only the responder registers for these events. llassert(mEventsTarget == mResponder.get());