summaryrefslogtreecommitdiff
path: root/platform/darwin
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2015-04-30 12:28:29 -0400
committerJohn Firebaugh <john.firebaugh@gmail.com>2015-04-30 12:40:10 -0400
commit64251eec75dd4cd9ec6aacc1c1e7ecc379b8ad9e (patch)
treefb0b38dcbcc96b9d4a92d1ed05f0995ad77bf657 /platform/darwin
parent95214472d433e3efa6d9045193271b38231387a2 (diff)
downloadqtlocation-mapboxgl-64251eec75dd4cd9ec6aacc1c1e7ecc379b8ad9e.tar.gz
Introduce and use uv::timer
Diffstat (limited to 'platform/darwin')
-rw-r--r--platform/darwin/http_request_nsurl.mm44
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);
}