From 2e95dda3f540466e61d292719547b0ffd44ad561 Mon Sep 17 00:00:00 2001 From: rogerman Date: Fri, 22 Apr 2022 18:23:46 -0700 Subject: [PATCH] Cocoa Port: Fix some memory leak issues, especially apparent when running Metal display views. --- desmume/src/frontend/cocoa/cocoa_GPU.mm | 8 +++ desmume/src/frontend/cocoa/cocoa_output.mm | 4 ++ .../userinterface/MacMetalDisplayView.mm | 52 ++++++++----------- 3 files changed, 35 insertions(+), 29 deletions(-) diff --git a/desmume/src/frontend/cocoa/cocoa_GPU.mm b/desmume/src/frontend/cocoa/cocoa_GPU.mm index dc77caa60..f1d5a0884 100644 --- a/desmume/src/frontend/cocoa/cocoa_GPU.mm +++ b/desmume/src/frontend/cocoa/cocoa_GPU.mm @@ -1587,10 +1587,13 @@ public: - (void) runFetchLoop { + NSAutoreleasePool *tempPool = nil; pthread_mutex_lock(&_mutexFetchExecute); do { + tempPool = [[NSAutoreleasePool alloc] init]; + while (_threadMessageID == MESSAGE_NONE) { pthread_cond_wait(&_condSignalFetch, &_mutexFetchExecute); @@ -1600,6 +1603,8 @@ public: [self pushVideoDataToAllDisplayViews]; _threadMessageID = MESSAGE_NONE; + [tempPool release]; + } while(true); } @@ -1796,7 +1801,10 @@ CVReturn MacDisplayLinkCallback(CVDisplayLinkRef displayLink, void *displayLinkContext) { MacClientSharedObject *sharedData = (MacClientSharedObject *)displayLinkContext; + + NSAutoreleasePool *tempPool = [[NSAutoreleasePool alloc] init]; [sharedData flushAllDisplaysOnDisplayLink:displayLink timeStampNow:inNow timeStampOutput:inOutputTime]; + [tempPool release]; return kCVReturnSuccess; } diff --git a/desmume/src/frontend/cocoa/cocoa_output.mm b/desmume/src/frontend/cocoa/cocoa_output.mm index 38cc14945..554f353aa 100644 --- a/desmume/src/frontend/cocoa/cocoa_output.mm +++ b/desmume/src/frontend/cocoa/cocoa_output.mm @@ -136,10 +136,13 @@ - (void) runMessageLoop { + NSAutoreleasePool *tempPool = nil; pthread_mutex_lock(&_mutexMessageLoop); do { + tempPool = [[NSAutoreleasePool alloc] init]; + while (_threadMessageID == MESSAGE_NONE) { pthread_cond_wait(&_condSignalMessage, &_mutexMessageLoop); @@ -148,6 +151,7 @@ [self handleSignalMessageID:_threadMessageID]; _threadMessageID = MESSAGE_NONE; + [tempPool release]; } while(true); } diff --git a/desmume/src/frontend/cocoa/userinterface/MacMetalDisplayView.mm b/desmume/src/frontend/cocoa/userinterface/MacMetalDisplayView.mm index bf7a305b1..54f7c6452 100644 --- a/desmume/src/frontend/cocoa/userinterface/MacMetalDisplayView.mm +++ b/desmume/src/frontend/cocoa/userinterface/MacMetalDisplayView.mm @@ -778,33 +778,30 @@ { const size_t listSize = cdvFlushList.size(); - @autoreleasepool + id cbFlush = [commandQueue commandBufferWithUnretainedReferences]; + id cbFinalize = [commandQueue commandBufferWithUnretainedReferences]; + + for (size_t i = 0; i < listSize; i++) { - id cbFlush = [commandQueue commandBufferWithUnretainedReferences]; - id cbFinalize = [commandQueue commandBufferWithUnretainedReferences]; - - for (size_t i = 0; i < listSize; i++) - { - ClientDisplay3DView *cdv = (ClientDisplay3DView *)cdvFlushList[i]; - cdv->FlushView(cbFlush); - } - - for (size_t i = 0; i < listSize; i++) - { - ClientDisplay3DView *cdv = (ClientDisplay3DView *)cdvFlushList[i]; - cdv->FinalizeFlush(cbFinalize, timeStampOutput->hostTime); - } - - [cbFlush enqueue]; - [cbFinalize enqueue]; - - [cbFlush commit]; - [cbFinalize commit]; - -#ifdef DEBUG - [commandQueue insertDebugCaptureBoundary]; -#endif + ClientDisplay3DView *cdv = (ClientDisplay3DView *)cdvFlushList[i]; + cdv->FlushView(cbFlush); } + + for (size_t i = 0; i < listSize; i++) + { + ClientDisplay3DView *cdv = (ClientDisplay3DView *)cdvFlushList[i]; + cdv->FinalizeFlush(cbFinalize, timeStampOutput->hostTime); + } + + [cbFlush enqueue]; + [cbFinalize enqueue]; + + [cbFlush commit]; + [cbFinalize commit]; + +#ifdef DEBUG + [commandQueue insertDebugCaptureBoundary]; +#endif } @end @@ -2528,10 +2525,7 @@ void MacMetalFetchObject::FetchFromBufferIndex(const u8 index) MacClientSharedObject *sharedViewObject = (MacClientSharedObject *)this->_clientData; this->_useDirectToCPUFilterPipeline = ([sharedViewObject numberViewsUsingDirectToCPUFiltering] > 0); - @autoreleasepool - { - [(MetalDisplayViewSharedData *)this->_clientData fetchFromBufferIndex:index]; - } + [(MetalDisplayViewSharedData *)this->_clientData fetchFromBufferIndex:index]; } void MacMetalFetchObject::_FetchNativeDisplayByID(const NDSDisplayID displayID, const u8 bufferIndex)