From 34403a6138922da2d97c24b8413e3693ab1d788f Mon Sep 17 00:00:00 2001
From: Richard Linden <none@none>
Date: Thu, 2 May 2013 13:02:16 -0700
Subject: SH-4080 WIP interesting: random crash on Mac changed sCurCameraID to
 enum in attempt to pinpoint memory stompage

---
 indra/newview/llviewercamera.cpp | 2 +-
 indra/newview/llviewercamera.h   | 2 +-
 indra/newview/pipeline.cpp       | 8 ++++----
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index 1f5bdc8589..45302ebb74 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -57,7 +57,7 @@
 LLTrace::CountStatHandle<> LLViewerCamera::sVelocityStat("camera_velocity");
 LLTrace::CountStatHandle<> LLViewerCamera::sAngularVelocityStat("camera_angular_velocity");
 
-U32 LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
+LLViewerCamera::eCameraID LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
 
 //glu pick matrix implementation borrowed from Mesa3D
 glh::matrix4f gl_pick_matrix(GLfloat x, GLfloat y, GLfloat width, GLfloat height, GLint* viewport)
diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h
index d7835d8567..7b2887d725 100644
--- a/indra/newview/llviewercamera.h
+++ b/indra/newview/llviewercamera.h
@@ -80,7 +80,7 @@ public:
 		NUM_CAMERAS
 	} eCameraID;
 
-	static U32 sCurCameraID;
+	static eCameraID sCurCameraID;
 
 	LLViewerCamera();
 
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 1b5148e560..acf3e7aa07 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -2252,7 +2252,7 @@ BOOL LLPipeline::getVisibleExtents(LLCamera& camera, LLVector3& min, LLVector3&
 	min = LLVector3(X,X,X);
 	max = LLVector3(-X,-X,-X);
 
-	U32 saved_camera_id = LLViewerCamera::sCurCameraID;
+	LLViewerCamera::eCameraID saved_camera_id = LLViewerCamera::sCurCameraID;
 	LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
 
 	BOOL res = TRUE;
@@ -9437,7 +9437,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
 				mShadowFrustPoints[j].clear();
 			}
 
-			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+j;
+			LLViewerCamera::sCurCameraID = (LLViewerCamera::eCameraID)(LLViewerCamera::CAMERA_SHADOW0+j);
 
 			//restore render matrices
 			glh_set_current_modelview(saved_view);
@@ -9821,7 +9821,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
 		//update shadow targets
 		for (U32 i = 0; i < 2; i++)
 		{ //for each current shadow
-			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW4+i;
+			LLViewerCamera::sCurCameraID = (LLViewerCamera::eCameraID)(LLViewerCamera::CAMERA_SHADOW4+i);
 
 			if (mShadowSpotLight[i].notNull() && 
 				(mShadowSpotLight[i] == mTargetShadowSpotLight[0] ||
@@ -9940,7 +9940,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
 
 			static LLCullResult result[2];
 
-			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+i+4;
+			LLViewerCamera::sCurCameraID = (LLViewerCamera::eCameraID)(LLViewerCamera::CAMERA_SHADOW0 + i + 4);
 
 			renderShadow(view[i+4], proj[i+4], shadow_cam, result[i], FALSE, FALSE, target_width);
 
-- 
cgit v1.2.3


From dd07e240538ae8eaed07526396069dae82448576 Mon Sep 17 00:00:00 2001
From: Richard Linden <none@none>
Date: Thu, 2 May 2013 19:38:35 -0700
Subject: SH-4080 WIP interesting: random crash on Mac added comments to
 llsingleton.h

---
 indra/llcommon/llsingleton.h | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h
index 40002313f1..1e87d9bd7b 100644
--- a/indra/llcommon/llsingleton.h
+++ b/indra/llcommon/llsingleton.h
@@ -143,6 +143,8 @@ public:
 		case INITIALIZING:
 			// go ahead and flag ourselves as initialized so we can be reentrant during initialization
 			sData.mInitState = INITIALIZED;	
+			// initialize singleton after constructing it so that it can reference other singletons which in turn depend on it,
+			// thus breaking cyclic dependencies
 			sData.mInstance->initSingleton(); 
 			return sData.mInstance;
 		case INITIALIZED:
@@ -150,6 +152,7 @@ public:
 		case DELETED:
 			llwarns << "Trying to access deleted singleton " << typeid(DERIVED_TYPE).name() << " creating new instance" << llendl;
 			SingletonLifetimeManager::construct();
+			// same as first time construction
 			sData.mInitState = INITIALIZED;	
 			sData.mInstance->initSingleton(); 
 			return sData.mInstance;
@@ -190,6 +193,8 @@ private:
 
 	struct SingletonData
 	{
+		// explicitly has a default constructor so that member variables are zero initialized in BSS
+		// and only changed by singleton logic, not constructor running during startup
 		EInitState		mInitState;
 		DERIVED_TYPE*	mInstance;
 	};
-- 
cgit v1.2.3