From 31a0d18ca1961b1cfb0785a1921b1f093167ebda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Mon, 19 Jan 2015 17:40:24 +0100 Subject: remove circular shared_ptr and a few other memory leaks --- platform/darwin/http_request_cocoa.mm | 64 ++++++++++++++++++++++------------- platform/darwin/log_nslog.mm | 30 +++++++++------- platform/darwin/string_nsstring.mm | 26 ++++++++------ 3 files changed, 73 insertions(+), 47 deletions(-) (limited to 'platform') 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 #include -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 { public: HTTPCocoaContext(uv_loop_t *loop); + ~HTTPCocoaContext(); + + NSURLSession *session = nil; + NSString *userAgent = nil; }; template<> pthread_key_t HTTPContext::key{}; template<> pthread_once_t HTTPContext::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(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(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(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(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; } -- cgit v1.2.1