Fix for EXT-8089 (Log spam from SLPlugin about "autoreleased with no pool in place - just leaking")

Added slplugin-objc.mm.

Made SLPlugin do the cocoa setup during initialization, and create/delete an
autorelease pool each time through its main loop.  This should make plugin code
that's using autorelease correctly not leak.

Fixed a bug in the version of setupCocoa() used in the viewer (it was never
setting its "inited" variable).
master
Monroe Linden 2010-06-25 14:18:22 -07:00
parent 92c33da517
commit fd799ca57e
5 changed files with 164 additions and 1 deletions

View File

@ -16,6 +16,7 @@ include_directories(
if (DARWIN)
include(CMakeFindFrameworks)
find_library(CARBON_LIBRARY Carbon)
find_library(COCOA_LIBRARY Cocoa)
endif (DARWIN)
@ -25,6 +26,22 @@ set(SLPlugin_SOURCE_FILES
slplugin.cpp
)
if (DARWIN)
list(APPEND SLPlugin_SOURCE_FILES
slplugin-objc.mm
)
list(APPEND SLPlugin_HEADER_FILES
slplugin-objc.h
)
endif (DARWIN)
set_source_files_properties(${SLPlugin_HEADER_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
if (SLPlugin_HEADER_FILES)
list(APPEND SLPlugin_SOURCE_FILES ${SLPlugin_HEADER_FILES})
endif (SLPlugin_HEADER_FILES)
add_executable(SLPlugin
WIN32
MACOSX_BUNDLE
@ -51,7 +68,7 @@ add_dependencies(SLPlugin
if (DARWIN)
# Mac version needs to link against Carbon
target_link_libraries(SLPlugin ${CARBON_LIBRARY})
target_link_libraries(SLPlugin ${CARBON_LIBRARY} ${COCOA_LIBRARY})
# Make sure the app bundle has a Resources directory (it will get populated by viewer-manifest.py later)
add_custom_command(
TARGET SLPlugin POST_BUILD

View File

@ -0,0 +1,40 @@
/**
* @file slplugin-objc.h
* @brief Header file for slplugin-objc.mm.
*
* @cond
*
* $LicenseInfo:firstyear=2010&license=viewergpl$
*
* Copyright (c) 2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlife.com/developers/opensource/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at http://secondlife.com/developers/opensource/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*
* @endcond
*/
/* Defined in slplugin-objc.mm: */
void setupCocoa();
void createAutoReleasePool();
void deleteAutoReleasePool();

View File

@ -0,0 +1,87 @@
/**
* @file slplugin-objc.mm
* @brief Objective-C++ file for use with the loader shell, so we can use a couple of Cocoa APIs.
*
* @cond
*
* $LicenseInfo:firstyear=2010&license=viewergpl$
*
* Copyright (c) 2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlife.com/developers/opensource/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at http://secondlife.com/developers/opensource/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*
* @endcond
*/
#include <AppKit/AppKit.h>
#include "slplugin-objc.h"
void setupCocoa()
{
static bool inited = false;
if(!inited)
{
createAutoReleasePool();
// The following prevents the Cocoa command line parser from trying to open 'unknown' arguements as documents.
// ie. running './secondlife -set Language fr' would cause a pop-up saying can't open document 'fr'
// when init'ing the Cocoa App window.
[[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"];
// This is a bit of voodoo taken from the Apple sample code "CarbonCocoa_PictureCursor":
// http://developer.apple.com/samplecode/CarbonCocoa_PictureCursor/index.html
// Needed for Carbon based applications which call into Cocoa
NSApplicationLoad();
// Must first call [[[NSWindow alloc] init] release] to get the NSWindow machinery set up so that NSCursor can use a window to cache the cursor image
[[[NSWindow alloc] init] release];
deleteAutoReleasePool();
inited = true;
}
}
static NSAutoreleasePool *sPool = NULL;
void createAutoReleasePool()
{
if(!sPool)
{
sPool = [[NSAutoreleasePool alloc] init];
}
}
void deleteAutoReleasePool()
{
if(sPool)
{
[sPool release];
sPool = NULL;
}
}

View File

@ -44,6 +44,7 @@
#if LL_DARWIN
#include <Carbon/Carbon.h>
#include "slplugin-objc.h"
#endif
#if LL_DARWIN || LL_LINUX
@ -229,10 +230,19 @@ int main(int argc, char **argv)
signal(SIGSYS, &crash_handler); // non-existent system call invoked
#endif
#if LL_DARWIN
setupCocoa();
createAutoReleasePool();
#endif
LLPluginProcessChild *plugin = new LLPluginProcessChild();
plugin->init(port);
#if LL_DARWIN
deleteAutoReleasePool();
#endif
LLTimer timer;
timer.start();
@ -260,6 +270,9 @@ int main(int argc, char **argv)
#endif
while(!plugin->isDone())
{
#if LL_DARWIN
createAutoReleasePool();
#endif
timer.reset();
plugin->idle();
#if LL_DARWIN
@ -377,6 +390,10 @@ int main(int argc, char **argv)
// exception handler such as QuickTime.
//checkExceptionHandler();
#endif
#if LL_DARWIN
deleteAutoReleasePool();
#endif
}
delete plugin;

View File

@ -64,6 +64,8 @@ void setupCocoa()
[[[NSWindow alloc] init] release];
[pool release];
inited = true;
}
}