diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2015-04-30 12:28:29 -0400 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2015-04-30 12:40:10 -0400 |
commit | 64251eec75dd4cd9ec6aacc1c1e7ecc379b8ad9e (patch) | |
tree | fb0b38dcbcc96b9d4a92d1ed05f0995ad77bf657 /platform/darwin | |
parent | 95214472d433e3efa6d9045193271b38231387a2 (diff) | |
download | qtlocation-mapboxgl-64251eec75dd4cd9ec6aacc1c1e7ecc379b8ad9e.tar.gz |
Introduce and use uv::timer
Diffstat (limited to 'platform/darwin')
-rw-r--r-- | platform/darwin/http_request_nsurl.mm | 44 |
1 files changed, 10 insertions, 34 deletions
diff --git a/platform/darwin/http_request_nsurl.mm b/platform/darwin/http_request_nsurl.mm index 9572970f20..509e158afd 100644 --- a/platform/darwin/http_request_nsurl.mm +++ b/platform/darwin/http_request_nsurl.mm @@ -58,14 +58,11 @@ public: void retry() override; private: - void cancelTimer(); void start(); void handleResult(NSData *data, NSURLResponse *res, NSError *error); void handleResponse(); void retry(uint64_t timeout); - static void restart(uv_timer_t *timer, int); - HTTPNSURLContext *context = nullptr; bool cancelled = false; NSURLSessionDataTask *task = nullptr; @@ -73,8 +70,8 @@ private: const std::shared_ptr<const Response> existingResponse; ResponseStatus status = ResponseStatus::PermanentError; uv::async async; + uv::timer timer; int attempts = 0; - uv_timer_t *timer = nullptr; enum : bool { PreemptImmediately, ExponentialBackoff } strategy = PreemptImmediately; static const int maxAttempts = 4; @@ -134,7 +131,8 @@ HTTPRequest::HTTPRequest(HTTPNSURLContext* context_, const Resource& resource_, : RequestBase(resource_, callback_), context(context_), existingResponse(existingResponse_), - async(loop, [this] { handleResponse(); }) { + async(loop, [this] { handleResponse(); }), + timer(loop) { context->addRequest(this); start(); } @@ -143,7 +141,7 @@ HTTPRequest::~HTTPRequest() { assert(!task); // Stop the backoff timer to avoid re-triggering this request. - cancelTimer(); + timer.stop(); context->removeRequest(this); } @@ -220,7 +218,7 @@ void HTTPRequest::cancel() { cancelled = true; // Stop the backoff timer to avoid re-triggering this request. - cancelTimer(); + timer.stop(); if (task) { [task cancel]; @@ -231,14 +229,6 @@ void HTTPRequest::cancel() { } } -void HTTPRequest::cancelTimer() { - if (timer) { - uv_timer_stop(timer); - uv::close(timer); - timer = nullptr; - } -} - int64_t parseCacheControl(const char *value) { if (value) { unsigned long long seconds = 0; @@ -360,34 +350,20 @@ void HTTPRequest::handleResult(NSData *data, NSURLResponse *res, NSError *error) void HTTPRequest::retry(uint64_t timeout) { response.reset(); - assert(!timer); - timer = new uv_timer_t; - timer->data = this; - uv_timer_init(async.get()->loop, timer); - uv_timer_start(timer, restart, timeout, 0); + timer.stop(); + timer.start(timeout, 0, [this] { start(); }); } void HTTPRequest::retry() { // All batons get notified when the network status changed, but some of them // might not actually wait for the network to become available again. - if (timer && strategy == PreemptImmediately) { + if (strategy == PreemptImmediately) { // Triggers the timer upon the next event loop iteration. - uv_timer_stop(timer); - uv_timer_start(timer, restart, 0, 0); + timer.stop(); + timer.start(0, 0, [this] { start(); }); } } -void HTTPRequest::restart(uv_timer_t *timer, int) { - // Restart the request. - auto impl = reinterpret_cast<HTTPRequest *>(timer->data); - - // Get rid of the timer. - impl->timer = nullptr; - uv::close(timer); - - impl->start(); -} - std::unique_ptr<HTTPContext> HTTPContext::createContext(uv_loop_t* loop) { return util::make_unique<HTTPNSURLContext>(loop); } |