From bf6bbe464218bea2787547efcf50a57452de0692 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Thu, 2 Aug 2012 11:45:38 -0400
Subject: [PATCH] MAINT-515 FIX, CHOP-100 FIX - technically we are avoiding
 these issues rather than fixing them; changing llcommon to be statically
 linked avoids the symbol issues with llcommon.dll

---
 indra/cmake/LLAddBuildTest.cmake |  9 +++++++++
 indra/cmake/LLCommon.cmake       |  2 +-
 indra/llcommon/llstat.cpp        | 19 ++++++++++++-------
 indra/llcommon/llstat.h          |  6 +++---
 4 files changed, 25 insertions(+), 11 deletions(-)
 mode change 100644 => 100755 indra/cmake/LLAddBuildTest.cmake

diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake
old mode 100644
new mode 100755
index a6f69a09e93..543075db5be
--- a/indra/cmake/LLAddBuildTest.cmake
+++ b/indra/cmake/LLAddBuildTest.cmake
@@ -201,6 +201,15 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
   endif(TEST_DEBUG)
   ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})
   SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}")
+  if (WINDOWS)
+    set_target_properties(INTEGRATION_TEST_${testname}
+      PROPERTIES 
+      LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /SUBSYSTEM:WINDOWS /INCLUDE:__tcmalloc"
+      LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\" /INCREMENTAL:NO"
+      LINK_FLAGS_RELEASE ""
+      )
+  endif(WINDOWS)
+
   if(STANDALONE)
     SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES COMPILE_FLAGS -I"${TUT_INCLUDE_DIR}")
   endif(STANDALONE)
diff --git a/indra/cmake/LLCommon.cmake b/indra/cmake/LLCommon.cmake
index 17e211cb993..d4694ad37a0 100644
--- a/indra/cmake/LLCommon.cmake
+++ b/indra/cmake/LLCommon.cmake
@@ -24,7 +24,7 @@ endif (LINUX)
 
 add_definitions(${TCMALLOC_FLAG})
 
-set(LLCOMMON_LINK_SHARED ON CACHE BOOL "Build the llcommon target as a shared library.")
+set(LLCOMMON_LINK_SHARED OFF CACHE BOOL "Build the llcommon target as a shared library.")
 if(LLCOMMON_LINK_SHARED)
   add_definitions(-DLL_COMMON_LINK_SHARED=1)
 endif(LLCOMMON_LINK_SHARED)
diff --git a/indra/llcommon/llstat.cpp b/indra/llcommon/llstat.cpp
index 057257057f5..b82d52797e9 100644
--- a/indra/llcommon/llstat.cpp
+++ b/indra/llcommon/llstat.cpp
@@ -40,7 +40,6 @@
 S32	            LLPerfBlock::sStatsFlags = LLPerfBlock::LLSTATS_NO_OPTIONAL_STATS;       // Control what is being recorded
 LLPerfBlock::stat_map_t    LLPerfBlock::sStatMap;    // Map full path string to LLStatTime objects, tracks all active objects
 std::string        LLPerfBlock::sCurrentStatPath = "";    // Something like "/total_time/physics/physics step"
-LLStat::stat_map_t LLStat::sStatList;
 
 //------------------------------------------------------------------------
 // Live config file to trigger stats logging
@@ -771,13 +770,19 @@ void LLStat::init()
 
 	if (!mName.empty())
 	{
-		stat_map_t::iterator iter = sStatList.find(mName);
-		if (iter != sStatList.end())
+		stat_map_t::iterator iter = getStatList().find(mName);
+		if (iter != getStatList().end())
 			llwarns << "LLStat with duplicate name: " << mName << llendl;
-		sStatList.insert(std::make_pair(mName, this));
+		getStatList().insert(std::make_pair(mName, this));
 	}
 }
 
+LLStat::stat_map_t& LLStat::getStatList()
+{
+	static LLStat::stat_map_t stat_list;
+	return stat_list;
+}
+
 LLStat::LLStat(const U32 num_bins, const BOOL use_frame_timer)
 	: mUseFrameTimer(use_frame_timer),
 	  mNumBins(num_bins)
@@ -803,10 +808,10 @@ LLStat::~LLStat()
 	if (!mName.empty())
 	{
 		// handle multiple entries with the same name
-		stat_map_t::iterator iter = sStatList.find(mName);
-		while (iter != sStatList.end() && iter->second != this)
+		stat_map_t::iterator iter = getStatList().find(mName);
+		while (iter != getStatList().end() && iter->second != this)
 			++iter;
-		sStatList.erase(iter);
+		getStatList().erase(iter);
 	}
 }
 
diff --git a/indra/llcommon/llstat.h b/indra/llcommon/llstat.h
index b877432e866..1a8404cc071 100644
--- a/indra/llcommon/llstat.h
+++ b/indra/llcommon/llstat.h
@@ -263,9 +263,9 @@ class LL_COMMON_API LLStat
 {
 private:
 	typedef std::multimap<std::string, LLStat*> stat_map_t;
-	static stat_map_t sStatList;
 
 	void init();
+	static stat_map_t& getStatList();
 
 public:
 	LLStat(U32 num_bins = 32, BOOL use_frame_timer = FALSE);
@@ -342,8 +342,8 @@ class LL_COMMON_API LLStat
 	static LLStat* getStat(const std::string& name)
 	{
 		// return the first stat that matches 'name'
-		stat_map_t::iterator iter = sStatList.find(name);
-		if (iter != sStatList.end())
+		stat_map_t::iterator iter = getStatList().find(name);
+		if (iter != getStatList().end())
 			return iter->second;
 		else
 			return NULL;
-- 
GitLab