diff options
| -rw-r--r-- | indra/cmake/00-Common.cmake | 4 | ||||
| -rw-r--r-- | indra/llcommon/llapp.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 4 | ||||
| -rw-r--r-- | indra/newview/featuretable.txt | 2 | ||||
| -rw-r--r-- | indra/newview/featuretable_linux.txt | 1 | ||||
| -rw-r--r-- | indra/newview/featuretable_mac.txt | 1 | ||||
| -rw-r--r-- | indra/newview/featuretable_solaris.txt | 2 | ||||
| -rw-r--r-- | indra/newview/llappviewer.cpp | 48 | ||||
| -rw-r--r-- | indra/newview/llappviewerwin32.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/llwindebug.cpp | 188 | ||||
| -rw-r--r-- | indra/newview/llwindebug.h | 49 | ||||
| -rw-r--r-- | install.xml | 4 | 
13 files changed, 294 insertions, 29 deletions
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 592e9fc901..a114d6e778 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -74,6 +74,10 @@ if (WINDOWS)    if (NOT VS_DISABLE_FATAL_WARNINGS)      add_definitions(/WX)    endif (NOT VS_DISABLE_FATAL_WARNINGS) + +  # configure win32 API for windows XP+ compatibility +  set(WINVER "0x0501" CACHE STRING "Win32 API Target version (see http://msdn.microsoft.com/en-us/library/aa383745%28v=VS.85%29.aspx)") +  add_definitions("/DWINVER=${WINVER}" "/D_WIN32_WINNT=${WINVER}")  endif (WINDOWS) diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index 0447ca93f5..be3b18d9c8 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -863,7 +863,13 @@ bool unix_post_minidump_callback(const char *dump_dir,  	llinfos << "generated minidump: " << LLApp::instance()->getMiniDumpFilename() << llendl;  	LLApp::runErrorHandler(); +	 +#ifndef LL_RELEASE_FOR_DOWNLOAD +	clear_signals(); +	return false; +#else  	return true; +#endif  }  #endif // !WINDOWS @@ -920,6 +926,10 @@ bool windows_post_minidump_callback(const wchar_t* dump_path,  		ms_sleep(10);  	} +#ifndef LL_RELEASE_FOR_DOWNLOAD +	return false; +#else  	return true; +#endif  }  #endif diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index ce42cb6038..92f701551b 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1150,10 +1150,12 @@ endif (LINUX)  if (WINDOWS)      list(APPEND viewer_SOURCE_FILES           llappviewerwin32.cpp +         llwindebug.cpp           )      list(APPEND viewer_HEADER_FILES           llappviewerwin32.h +         llwindebug.h           )      # precompiled header configuration diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index b493f38d76..d51498f6d1 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11404,9 +11404,9 @@        <key>Persist</key>        <integer>0</integer>        <key>Type</key> -      <string>Boolean</string> +      <string>S32</string>        <key>Value</key> -      <integer>0</integer> +      <integer>-1</integer>      </map>      <key>WaterEditPresets</key>      <map> diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index e8591ca086..1c763453dc 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -58,6 +58,8 @@ Disregard96DefaultDrawDistance	1	1  RenderTextureMemoryMultiple		1	1.0  RenderShaderLightingMaxLevel	1	3  SkyUseClassicClouds			1	1 +WatchdogDisabled				1	1 +  //  // Low Graphics Settings diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index 779490c9f7..45de51f3cf 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -57,6 +57,7 @@ Disregard128DefaultDrawDistance	1	1  Disregard96DefaultDrawDistance	1	1  RenderTextureMemoryMultiple		1	1.0  SkyUseClassicClouds			1	1 +WatchdogDisabled				1	1  //  // Low Graphics Settings diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 47033efc47..e89b0cc49d 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -59,6 +59,7 @@ RenderTextureMemoryMultiple		1	0.5  Disregard128DefaultDrawDistance	1	1  Disregard96DefaultDrawDistance	1	1  SkyUseClassicClouds			1	1 +WatchdogDisabled				1	1  //  // Low Graphics Settings diff --git a/indra/newview/featuretable_solaris.txt b/indra/newview/featuretable_solaris.txt index 6edd280686..0ae463332c 100644 --- a/indra/newview/featuretable_solaris.txt +++ b/indra/newview/featuretable_solaris.txt @@ -37,6 +37,8 @@ VertexShaderEnable	1	1  RenderTextureMemoryMultiple		1	1.0  UseOcclusion		1       1  RenderCubeMap		1       1 +WatchdogDisabled				1	1 +  //  // Class 0 Hardware (Unknown or just old) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 1ed63555b0..dc514eafe7 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -81,7 +81,7 @@  #include "llvoicechannel.h"  #include "llvoavatarself.h"  #include "llsidetray.h" - +#include "llfeaturemanager.h"  #include "llweb.h"  #include "llsecondlifeurls.h" @@ -379,14 +379,8 @@ bool handleCrashSubmitBehaviorChanged(const LLSD& newvalue)  	const S32 NEVER_SUBMIT_REPORT = 2;  	if(cb == NEVER_SUBMIT_REPORT)  	{ -// 		LLWatchdog::getInstance()->cleanup(); // SJB: cleaning up a running watchdog thread is unsafe  		LLAppViewer::instance()->destroyMainloopTimeout();  	} -	else if(gSavedSettings.getBOOL("WatchdogEnabled") == TRUE) -	{ -		// Don't re-enable the watchdog when we change the setting; this may get called before it's started -// 		LLWatchdog::getInstance()->init(); -	}  	return true;  } @@ -1689,14 +1683,6 @@ bool LLAppViewer::initThreads()  	static const bool enable_threads = true;  #endif -	const S32 NEVER_SUBMIT_REPORT = 2; -	bool use_watchdog = gSavedSettings.getBOOL("WatchdogEnabled"); -	bool send_reports = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) != NEVER_SUBMIT_REPORT; -	if(use_watchdog && send_reports) -	{ -		LLWatchdog::getInstance()->init(watchdog_killer_callback); -	} -  	LLVFSThread::initClass(enable_threads && false);  	LLLFSThread::initClass(enable_threads && false); @@ -1925,18 +1911,11 @@ bool LLAppViewer::initConfiguration()  	}  #endif -	//*FIX:Mani - Set default to disabling watchdog mainloop  -	// timeout for mac and linux. There is no call stack info  -	// on these platform to help debug.  #ifndef	LL_RELEASE_FOR_DOWNLOAD -	gSavedSettings.setBOOL("WatchdogEnabled", FALSE);  	gSavedSettings.setBOOL("QAMode", TRUE ); +	gSavedSettings.setS32("WatchdogEnabled", 0);  #endif - -#ifndef LL_WINDOWS -	gSavedSettings.setBOOL("WatchdogEnabled", FALSE); -#endif - +	  	gCrashSettings.getControl(CRASH_BEHAVIOR_SETTING)->getSignal()->connect(boost::bind(&handleCrashSubmitBehaviorChanged, _2));	  	// These are warnings that appear on the first experience of that condition. @@ -2364,6 +2343,25 @@ bool LLAppViewer::initWindow()  		gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),  		FALSE, ignorePixelDepth); +	// Need to load feature table before cheking to start watchdog. +	const S32 NEVER_SUBMIT_REPORT = 2; +	bool use_watchdog = false; +	int watchdog_enabled_setting = gSavedSettings.getS32("WatchdogEnabled"); +	if(watchdog_enabled_setting == -1){ +		use_watchdog = !LLFeatureManager::getInstance()->isFeatureAvailable("WatchdogDisabled"); +	} +	else +	{ +		// The user has explicitly set this setting; always use that value. +		use_watchdog = bool(watchdog_enabled_setting); +	} + +	bool send_reports = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) != NEVER_SUBMIT_REPORT; +	if(use_watchdog && send_reports) +	{ +		LLWatchdog::getInstance()->init(watchdog_killer_callback); +	} +  	LLNotificationsUI::LLNotificationManager::getInstance();  	if (gSavedSettings.getBOOL("WindowMaximized")) @@ -4133,7 +4131,7 @@ void LLAppViewer::forceErrorBreakpoint()  void LLAppViewer::forceErrorBadMemoryAccess()  {      S32* crash = NULL; -    *crash = 0xDEADBEEF; +    *crash = 0xDEADBEEF;        return;  } diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index e3ef04d03d..8c9fd09dcb 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -64,6 +64,10 @@  #include "llcommandlineparser.h"  #include "lltrans.h" +#ifndef LL_RELEASE_FOR_DOWNLOAD +#include "llwindebug.h" +#endif +  // *FIX:Mani - This hack is to fix a linker issue with libndofdev.lib  // The lib was compiled under VS2005 - in VS2003 we need to remap assert  #ifdef LL_DEBUG @@ -342,6 +346,10 @@ bool LLAppViewerWin32::init()  	llinfos << "Turning off Windows error reporting." << llendl;  	disableWinErrorReporting(); +#ifndef LL_RELEASE_FOR_DOWNLOAD +	LLWinDebug::instance().init(); +#endif +  	return LLAppViewer::init();  } diff --git a/indra/newview/llwindebug.cpp b/indra/newview/llwindebug.cpp new file mode 100644 index 0000000000..502fefd4ef --- /dev/null +++ b/indra/newview/llwindebug.cpp @@ -0,0 +1,188 @@ +/** + * @file llwindebug.cpp + * @brief Windows debugging functions + * + * $LicenseInfo:firstyear=2004&license=viewergpl$ + * + * Copyright (c) 2004-2009, 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://secondlifegrid.net/programs/open_source/licensing/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://secondlifegrid.net/programs/open_source/licensing/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$ + */ +#include "llviewerprecompiledheaders.h" + +#include "llwindebug.h" +#include "lldir.h" + + +// based on dbghelp.h +typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType, +									CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, +									CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, +									CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam +									); + +MINIDUMPWRITEDUMP f_mdwp = NULL; + + +class LLMemoryReserve { +public: +	LLMemoryReserve(); +	~LLMemoryReserve(); +	void reserve(); +	void release(); +protected: +	unsigned char *mReserve; +	static const size_t MEMORY_RESERVATION_SIZE; +}; + +LLMemoryReserve::LLMemoryReserve() : +	mReserve(NULL) +{ +}; + +LLMemoryReserve::~LLMemoryReserve() +{ +	release(); +} + +// I dunno - this just seemed like a pretty good value. +const size_t LLMemoryReserve::MEMORY_RESERVATION_SIZE = 5 * 1024 * 1024; + +void LLMemoryReserve::reserve() +{ +	if(NULL == mReserve) +		mReserve = new unsigned char[MEMORY_RESERVATION_SIZE]; +}; + +void LLMemoryReserve::release() +{ +	delete [] mReserve; +	mReserve = NULL; +}; + +static LLMemoryReserve gEmergencyMemoryReserve; + + +LONG NTAPI vectoredHandler(PEXCEPTION_POINTERS exception_infop) +{ +	LLWinDebug::instance().generateMinidump(exception_infop); +	return EXCEPTION_CONTINUE_SEARCH; +} + +// static +void  LLWinDebug::init() +{ +	static bool s_first_run = true; +	// Load the dbghelp dll now, instead of waiting for the crash. +	// Less potential for stack mangling + +	if (s_first_run) +	{ +		// First, try loading from the directory that the app resides in. +		std::string local_dll_name = gDirUtilp->findFile("dbghelp.dll", gDirUtilp->getWorkingDir(), gDirUtilp->getExecutableDir()); + +		HMODULE hDll = NULL; +		hDll = LoadLibraryA(local_dll_name.c_str()); +		if (!hDll) +		{ +			hDll = LoadLibrary(L"dbghelp.dll"); +		} + +		if (!hDll) +		{ +			LL_WARNS("AppInit") << "Couldn't find dbghelp.dll!" << LL_ENDL; +		} +		else +		{ +			f_mdwp = (MINIDUMPWRITEDUMP) GetProcAddress(hDll, "MiniDumpWriteDump"); + +			if (!f_mdwp) +			{ +				FreeLibrary(hDll); +				hDll = NULL; +			} +		} + +		gEmergencyMemoryReserve.reserve(); + +		s_first_run = false; + +		// Add this exeption hanlder to save windows style minidump. +		AddVectoredExceptionHandler(0, &vectoredHandler); +	} +} + +void LLWinDebug::writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename) +{ +	if(f_mdwp == NULL || gDirUtilp == NULL) +	{ +		return; +	} +	else +	{ +		std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, filename); + +		HANDLE hFile = CreateFileA(dump_path.c_str(), +									GENERIC_WRITE, +									FILE_SHARE_WRITE, +									NULL, +									CREATE_ALWAYS, +									FILE_ATTRIBUTE_NORMAL, +									NULL); + +		if (hFile != INVALID_HANDLE_VALUE) +		{ +			// Write the dump, ignoring the return value +			f_mdwp(GetCurrentProcess(), +					GetCurrentProcessId(), +					hFile, +					type, +					ExInfop, +					NULL, +					NULL); + +			CloseHandle(hFile); +		} + +	} +} + +// static +void LLWinDebug::generateMinidump(struct _EXCEPTION_POINTERS *exception_infop) +{ +	std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, +												"SecondLifeException"); +	if (exception_infop) +	{ +		// Since there is exception info... Release the hounds. +		gEmergencyMemoryReserve.release(); + +		_MINIDUMP_EXCEPTION_INFORMATION ExInfo; + +		ExInfo.ThreadId = ::GetCurrentThreadId(); +		ExInfo.ExceptionPointers = exception_infop; +		ExInfo.ClientPointers = NULL; +		writeDumpToFile((MINIDUMP_TYPE)(MiniDumpWithDataSegs | MiniDumpWithIndirectlyReferencedMemory), &ExInfo, "SecondLife.dmp"); +	} +} diff --git a/indra/newview/llwindebug.h b/indra/newview/llwindebug.h new file mode 100644 index 0000000000..809d1b8cc3 --- /dev/null +++ b/indra/newview/llwindebug.h @@ -0,0 +1,49 @@ +/**  + * @file llwindebug.h + * @brief LLWinDebug class header file + * + * $LicenseInfo:firstyear=2004&license=viewergpl$ + *  + * Copyright (c) 2004-2009, 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://secondlifegrid.net/programs/open_source/licensing/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://secondlifegrid.net/programs/open_source/licensing/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$ + */ + +#ifndef LL_LLWINDEBUG_H +#define LL_LLWINDEBUG_H + +#include "stdtypes.h" +#include <dbghelp.h> + +class LLWinDebug: +	public LLSingleton<LLWinDebug> +{ +public: +	static void init(); +	static void generateMinidump(struct _EXCEPTION_POINTERS *pExceptionInfo = NULL); +private: +	static void writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename); +}; + +#endif // LL_LLWINDEBUG_H diff --git a/install.xml b/install.xml index 39806a664d..3795fc3757 100644 --- a/install.xml +++ b/install.xml @@ -214,9 +214,9 @@            <key>windows</key>            <map>              <key>md5sum</key> -            <string>94fd43f534e2055858d524086384907d</string> +            <string>72e6e2eff5d146a107f3059b6c31fb95</string>              <key>url</key> -            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20100219.tar.bz2</uri> +            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20100630.tar.bz2</uri>            </map>          </map>        </map>  | 
