diff options
author | RĂ¼diger Timm <rt@openoffice.org> | 2008-08-27 07:09:08 +0000 |
---|---|---|
committer | RĂ¼diger Timm <rt@openoffice.org> | 2008-08-27 07:09:08 +0000 |
commit | ea6d634bd2ec91de4a602cd6e64ebcd20b9cb164 (patch) | |
tree | 341d29e3d50da635f2066a9fabf1b8b8846045e7 /vcl/aqua/source/app/vclnsapp.mm | |
parent | 7aed8dee0ea6bfbb8aaf180de876ab3ff2f9ede9 (diff) |
INTEGRATION: CWS vcl30stop5_DEV300 (1.8.42); FILE MERGED
2008/08/13 18:12:57 pl 1.8.42.1: #i92766# workaround a weird crash involving a wrong retain count
Diffstat (limited to 'vcl/aqua/source/app/vclnsapp.mm')
-rwxr-xr-x | vcl/aqua/source/app/vclnsapp.mm | 61 |
1 files changed, 58 insertions, 3 deletions
diff --git a/vcl/aqua/source/app/vclnsapp.mm b/vcl/aqua/source/app/vclnsapp.mm index 1fc9e6fc9f9e..a8516b2a9da6 100755 --- a/vcl/aqua/source/app/vclnsapp.mm +++ b/vcl/aqua/source/app/vclnsapp.mm @@ -7,7 +7,7 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: vclnsapp.mm,v $ - * $Revision: 1.8 $ + * $Revision: 1.9 $ * * This file is part of OpenOffice.org. * @@ -216,9 +216,64 @@ -(NSApplicationTerminateReply)applicationShouldTerminate: (NSApplication *) app { - const SalData* pSalData = GetSalData(); + SalData* pSalData = GetSalData(); + #if 1 // currently do some really bad hack if( ! pSalData->maFrames.empty() ) - return pSalData->maFrames.front()->CallCallback( SALEVENT_SHUTDOWN, NULL ) ? NSTerminateCancel : NSTerminateNow; + { + /* #i92766# something really weird is going on with the retain count of + our windows; sometimes we get a duplicate free before exit on one of our + NSWindows. The reason is unclear; to avoid this currently we retain them once more + + FIXME: this is a really bad hack, relying on the system to catch the leaked + resources. Find out what really goes on here and fix it ! + */ + std::vector< NSWindow* > aHackRetainedWindows; + for( std::list< AquaSalFrame* >::iterator it = pSalData->maFrames.begin(); + it != pSalData->maFrames.end(); ++it ) + { + #if OSL_DEBUG_LEVEL > 1 + Window* pWin = (*it)->GetWindow(); + String aTitle = pWin->GetText(); + Window* pClient = pWin->ImplGetClientWindow(); + fprintf( stderr, "retaining %p (old count %d) windowtype=%s clienttyp=%s title=%s\n", + (*it)->mpWindow, [(*it)->mpWindow retainCount], + typeid(*pWin).name(), pClient ? typeid(*pClient).name() : "<nil>", + rtl::OUStringToOString( aTitle, RTL_TEXTENCODING_UTF8 ).getStr() + ); + #endif + [(*it)->mpWindow retain]; + aHackRetainedWindows.push_back( (*it)->mpWindow ); + } + if( pSalData->maFrames.front()->CallCallback( SALEVENT_SHUTDOWN, NULL ) ) + { + for( std::vector< NSWindow* >::iterator it = aHackRetainedWindows.begin(); + it != aHackRetainedWindows.end(); ++it ) + { + // clean up the retaing count again from the shutdown workaround + #if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "releasing %p\n", (*it) ); + #endif + [(*it) release]; + } + return NSTerminateCancel; + } + #if OSL_DEBUG_LEVEL > 1 + for( std::list< AquaSalFrame* >::iterator it = pSalData->maFrames.begin(); + it != pSalData->maFrames.end(); ++it ) + { + Window* pWin = (*it)->GetWindow(); + String aTitle = pWin->GetText(); + Window* pClient = pWin->ImplGetClientWindow(); + fprintf( stderr, "frame still alive: NSWindow %p windowtype=%s clienttyp=%s title=%s\n", + (*it)->mpWindow, typeid(*pWin).name(), pClient ? typeid(*pClient).name() : "<nil>", + rtl::OUStringToOString( aTitle, RTL_TEXTENCODING_UTF8 ).getStr() + ); + } + #endif + } + #else // the clean version follows + return pSalData->maFrames.front()->CallCallback( SALEVENT_SHUTDOWN, NULL ) ? NSTerminateCancel : NSTerminateNow; + #endif return NSTerminateNow; } |