summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2015-01-19 17:40:24 +0100
committerKonstantin Käfer <mail@kkaefer.com>2015-02-04 10:49:05 +0100
commit31a0d18ca1961b1cfb0785a1921b1f093167ebda (patch)
tree412b555337be9ccb5cc4832a49cb85a48690c1d4 /platform
parent5602ba2f07a893604ea0506b3d580d4f2e2999ae (diff)
downloadqtlocation-mapboxgl-31a0d18ca1961b1cfb0785a1921b1f093167ebda.tar.gz
remove circular shared_ptr and a few other memory leaks
Diffstat (limited to 'platform')
-rw-r--r--platform/darwin/http_request_cocoa.mm64
-rw-r--r--platform/darwin/log_nslog.mm30
-rw-r--r--platform/darwin/string_nsstring.mm26
3 files changed, 73 insertions, 47 deletions
diff --git a/platform/darwin/http_request_cocoa.mm b/platform/darwin/http_request_cocoa.mm
index 163d4cf2db..77df1f6641 100644
--- a/platform/darwin/http_request_cocoa.mm
+++ b/platform/darwin/http_request_cocoa.mm
@@ -11,10 +11,6 @@
#include <map>
#include <cassert>
-dispatch_once_t request_initialize = 0;
-NSURLSession *session = nullptr;
-NSString *userAgent = nil;
-
namespace mbgl {
enum class ResponseStatus : uint8_t {
@@ -84,12 +80,39 @@ private:
class HTTPCocoaContext : public HTTPContext<HTTPCocoaContext> {
public:
HTTPCocoaContext(uv_loop_t *loop);
+ ~HTTPCocoaContext();
+
+ NSURLSession *session = nil;
+ NSString *userAgent = nil;
};
template<> pthread_key_t HTTPContext<HTTPCocoaContext>::key{};
template<> pthread_once_t HTTPContext<HTTPCocoaContext>::once = PTHREAD_ONCE_INIT;
-HTTPCocoaContext::HTTPCocoaContext(uv_loop_t *loop_) : HTTPContext(loop_) {}
+HTTPCocoaContext::HTTPCocoaContext(uv_loop_t *loop_) : HTTPContext(loop_) {
+ @autoreleasepool {
+ NSURLSessionConfiguration *sessionConfig =
+ [NSURLSessionConfiguration defaultSessionConfiguration];
+ sessionConfig.timeoutIntervalForResource = 30;
+ sessionConfig.HTTPMaximumConnectionsPerHost = 8;
+ sessionConfig.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
+ sessionConfig.URLCache = nil;
+
+ session = [NSURLSession sessionWithConfiguration:sessionConfig];
+ [session retain];
+
+ // Write user agent string
+ userAgent = @"MapboxGL";
+ }
+}
+
+HTTPCocoaContext::~HTTPCocoaContext() {
+ [session release];
+ session = nullptr;
+
+ [userAgent release];
+ userAgent = nullptr;
+}
// -------------------------------------------------------------------------------------------------
@@ -128,18 +151,22 @@ void HTTPRequestImpl::start() {
}
}
- [req addValue:userAgent forHTTPHeaderField:@"User-Agent"];
+ [req addValue:context->userAgent forHTTPHeaderField:@"User-Agent"];
- task = [session dataTaskWithRequest:req
+ task = [context->session dataTaskWithRequest:req
completionHandler:^(NSData *data, NSURLResponse *res,
NSError *error) { handleResult(data, res, error); }];
[req release];
+ [task retain];
[task resume];
}
}
void HTTPRequestImpl::handleResponse() {
- task = nullptr;
+ if (task) {
+ [task release];
+ task = nullptr;
+ }
if (request) {
if (status == ResponseStatus::TemporaryError && attempts < maxAttempts) {
@@ -171,8 +198,11 @@ void HTTPRequestImpl::cancel() {
context->removeRequest(request);
request = nullptr;
- [task cancel];
- task = nullptr;
+ if (task) {
+ [task cancel];
+ [task release];
+ task = nullptr;
+ }
}
HTTPRequestImpl::~HTTPRequestImpl() {
@@ -340,20 +370,6 @@ void HTTPRequestImpl::restart(uv_timer_t *timer, int) {
HTTPRequest::HTTPRequest(DefaultFileSource *source, const Resource &resource)
: SharedRequestBase(source, resource) {
- // Global initialization.
- dispatch_once(&request_initialize, ^{
- NSURLSessionConfiguration *sessionConfig =
- [NSURLSessionConfiguration defaultSessionConfiguration];
- sessionConfig.timeoutIntervalForResource = 30;
- sessionConfig.HTTPMaximumConnectionsPerHost = 8;
- sessionConfig.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
- sessionConfig.URLCache = nil;
-
- session = [NSURLSession sessionWithConfiguration:sessionConfig];
-
- // Write user agent string
- userAgent = @"MapboxGL";
- });
}
HTTPRequest::~HTTPRequest() {
diff --git a/platform/darwin/log_nslog.mm b/platform/darwin/log_nslog.mm
index b196930b23..ea5fddf0b9 100644
--- a/platform/darwin/log_nslog.mm
+++ b/platform/darwin/log_nslog.mm
@@ -7,14 +7,13 @@
namespace mbgl {
void NSLogBackend::record(EventSeverity severity, Event event, const std::string &msg) {
- NSLog(@"[%s] %s: %@", EventSeverityClass(severity).c_str(), EventClass(event).c_str(),
- [[NSString alloc] initWithBytes:msg.data()
- length:msg.size()
- encoding:NSUTF8StringEncoding]);
+ NSString *message =
+ [[NSString alloc] initWithBytes:msg.data() length:msg.size() encoding:NSUTF8StringEncoding];
+ NSLog(@"[%s] %s: %@", EventSeverityClass(severity).c_str(), EventClass(event).c_str(), message);
+ [message release];
}
-
-void NSLogBackend::record(EventSeverity severity, Event event, const char* format, ...) {
+void NSLogBackend::record(EventSeverity severity, Event event, const char *format, ...) {
va_list args;
va_start(args, format);
const size_t len = vsnprintf(NULL, 0, format, args);
@@ -23,17 +22,22 @@ void NSLogBackend::record(EventSeverity severity, Event event, const char* forma
va_start(args, format);
vsnprintf(buffer.get(), len + 1, format, args);
va_end(args);
- NSLog(@"[%s] %s: %s", EventSeverityClass(severity).c_str(), EventClass(event).c_str(), buffer.get());
+ NSLog(@"[%s] %s: %s", EventSeverityClass(severity).c_str(), EventClass(event).c_str(),
+ buffer.get());
}
void NSLogBackend::record(EventSeverity severity, Event event, int64_t code) {
- NSLog(@"[%s] %s: (%lld)", EventSeverityClass(severity).c_str(), EventClass(event).c_str(), code);
+ NSLog(@"[%s] %s: (%lld)", EventSeverityClass(severity).c_str(), EventClass(event).c_str(),
+ code);
}
-void NSLogBackend::record(EventSeverity severity, Event event, int64_t code, const std::string &msg) {
- NSLog(@"[%s] %s: (%lld) %@", EventSeverityClass(severity).c_str(), EventClass(event).c_str(), code,
- [[NSString alloc] initWithBytes:msg.data()
- length:msg.size()
- encoding:NSUTF8StringEncoding]);
+void NSLogBackend::record(EventSeverity severity, Event event, int64_t code,
+ const std::string &msg) {
+ NSString *message =
+ [[NSString alloc] initWithBytes:msg.data() length:msg.size() encoding:NSUTF8StringEncoding];
+ NSLog(@"[%s] %s: (%lld) %@", EventSeverityClass(severity).c_str(), EventClass(event).c_str(),
+ code, message);
+ [message release];
}
+
}
diff --git a/platform/darwin/string_nsstring.mm b/platform/darwin/string_nsstring.mm
index ef6b96062a..86c2c07edd 100644
--- a/platform/darwin/string_nsstring.mm
+++ b/platform/darwin/string_nsstring.mm
@@ -6,20 +6,26 @@ namespace mbgl {
namespace platform {
std::string uppercase(const std::string &string) {
- NSString *nsstring = [[NSString alloc] initWithBytesNoCopy:const_cast<char *>(string.data()) length:string.size() encoding:NSUTF8StringEncoding freeWhenDone:NO];
- NSString *nsstring2 = [nsstring uppercaseString];
- [nsstring release];
- const std::string result { [nsstring2 cStringUsingEncoding:NSUTF8StringEncoding], [nsstring2 lengthOfBytesUsingEncoding:NSUTF8StringEncoding] };
- [nsstring2 release];
+ NSString *original = [[NSString alloc] initWithBytesNoCopy:const_cast<char *>(string.data())
+ length:string.size()
+ encoding:NSUTF8StringEncoding
+ freeWhenDone:NO];
+ NSString *uppercase = [original uppercaseString];
+ const std::string result{[uppercase cStringUsingEncoding : NSUTF8StringEncoding],
+ [uppercase lengthOfBytesUsingEncoding:NSUTF8StringEncoding]};
+ [original release];
return result;
}
std::string lowercase(const std::string &string) {
- NSString *nsstring = [[NSString alloc] initWithBytesNoCopy:const_cast<char *>(string.data()) length:string.size() encoding:NSUTF8StringEncoding freeWhenDone:NO];
- NSString *nsstring2 = [nsstring lowercaseString];
- [nsstring release];
- const std::string result { [nsstring2 cStringUsingEncoding:NSUTF8StringEncoding], [nsstring2 lengthOfBytesUsingEncoding:NSUTF8StringEncoding] };
- [nsstring2 release];
+ NSString *original = [[NSString alloc] initWithBytesNoCopy:const_cast<char *>(string.data())
+ length:string.size()
+ encoding:NSUTF8StringEncoding
+ freeWhenDone:NO];
+ NSString *lowercase = [original lowercaseString];
+ const std::string result{[lowercase cStringUsingEncoding : NSUTF8StringEncoding],
+ [lowercase lengthOfBytesUsingEncoding:NSUTF8StringEncoding]};
+ [original release];
return result;
}