From 7598fa32e59a20fd52dfab599a6bc284878eda0a Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Fri, 17 Mar 2023 12:15:47 -0700 Subject: [PATCH] Wrap the iOS platform message handler in an autorelease pool block (flutter/engine#40373) Wrap the iOS platform message handler in an autorelease pool block --- .../ios/platform_message_handler_ios.mm | 80 ++++++++++--------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/engine/src/flutter/shell/platform/darwin/ios/platform_message_handler_ios.mm b/engine/src/flutter/shell/platform/darwin/ios/platform_message_handler_ios.mm index df6582882f..8a1b2ebe0d 100644 --- a/engine/src/flutter/shell/platform/darwin/ios/platform_message_handler_ios.mm +++ b/engine/src/flutter/shell/platform/darwin/ios/platform_message_handler_ios.mm @@ -46,50 +46,52 @@ PlatformMessageHandlerIos::PlatformMessageHandlerIos( void PlatformMessageHandlerIos::HandlePlatformMessage(std::unique_ptr message) { // This can be called from any isolate's thread. - fml::RefPtr completer = message->response(); - HandlerInfo handler_info; - { - // TODO(gaaclarke): This mutex is a bottleneck for multiple isolates sending - // messages at the same time. This could be potentially changed to a - // read-write lock. - std::lock_guard lock(message_handlers_mutex_); - auto it = message_handlers_.find(message->channel()); - if (it != message_handlers_.end()) { - handler_info = it->second; - } - } - if (handler_info.handler) { - FlutterBinaryMessageHandler handler = handler_info.handler; - NSData* data = nil; - if (message->hasData()) { - data = ConvertMappingToNSData(message->releaseData()); + @autoreleasepool { + fml::RefPtr completer = message->response(); + HandlerInfo handler_info; + { + // TODO(gaaclarke): This mutex is a bottleneck for multiple isolates sending + // messages at the same time. This could be potentially changed to a + // read-write lock. + std::lock_guard lock(message_handlers_mutex_); + auto it = message_handlers_.find(message->channel()); + if (it != message_handlers_.end()) { + handler_info = it->second; + } } + if (handler_info.handler) { + FlutterBinaryMessageHandler handler = handler_info.handler; + NSData* data = nil; + if (message->hasData()) { + data = ConvertMappingToNSData(message->releaseData()); + } - uint64_t platform_message_id = platform_message_counter++; - TRACE_EVENT_ASYNC_BEGIN1("flutter", "PlatformChannel ScheduleHandler", platform_message_id, - "channel", message->channel().c_str()); - dispatch_block_t run_handler = ^{ - handler(data, ^(NSData* reply) { - TRACE_EVENT_ASYNC_END0("flutter", "PlatformChannel ScheduleHandler", platform_message_id); - // Called from any thread. - if (completer) { - if (reply) { - completer->Complete(ConvertNSDataToMappingPtr(reply)); - } else { - completer->CompleteEmpty(); + uint64_t platform_message_id = platform_message_counter++; + TRACE_EVENT_ASYNC_BEGIN1("flutter", "PlatformChannel ScheduleHandler", platform_message_id, + "channel", message->channel().c_str()); + dispatch_block_t run_handler = ^{ + handler(data, ^(NSData* reply) { + TRACE_EVENT_ASYNC_END0("flutter", "PlatformChannel ScheduleHandler", platform_message_id); + // Called from any thread. + if (completer) { + if (reply) { + completer->Complete(ConvertNSDataToMappingPtr(reply)); + } else { + completer->CompleteEmpty(); + } } - } - }); - }; + }); + }; - if (handler_info.task_queue.get()) { - [handler_info.task_queue.get() dispatch:run_handler]; + if (handler_info.task_queue.get()) { + [handler_info.task_queue.get() dispatch:run_handler]; + } else { + dispatch_async(dispatch_get_main_queue(), run_handler); + } } else { - dispatch_async(dispatch_get_main_queue(), run_handler); - } - } else { - if (completer) { - completer->CompleteEmpty(); + if (completer) { + completer->CompleteEmpty(); + } } } }