From 7f8ec9f142f34057fc10436f94ce420183cf75b8 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 29 Jun 2011 20:35:44 -0400 Subject: CHOP-753: Introduce LLSD access to LLMemoryInfo ** BROKEN ** This is known not to compile on Mac yet; checking in to concurrently work on Linux-specific code. --- indra/llcommon/llsys.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'indra/llcommon/llsys.h') diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h index 41a4f25000..5b44757e08 100644 --- a/indra/llcommon/llsys.h +++ b/indra/llcommon/llsys.h @@ -36,6 +36,7 @@ // llinfos << info << llendl; // +#include "llsd.h" #include #include @@ -117,6 +118,33 @@ public: //get the available memory infomation in KiloBytes. static void getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb); + + // Retrieve a map of memory statistics. The keys of the map are platform- + // dependent. The values are in kilobytes. + LLSD getStatsMap() const; + + // Retrieve memory statistics: an array of pair arrays [name, value]. This + // is the same data as presented in getStatsMap(), but it preserves the + // order in which we retrieved it from the OS in case that's useful. The + // set of statistics names is platform-dependent. The values are in + // kilobytes to try to avoid integer overflow. + LLSD getStatsArray() const; + + // Re-fetch memory data (as reported by stream() and getStats*()) from the + // system. Normally this is fetched at construction time. Return (*this) + // to permit usage of the form: + // @code + // LLMemoryInfo info; + // ... + // info.refresh().getStatsArray(); + // @endcode + LLMemoryInfo& refresh(); + +private: + // Internally, we store memory stats as for getStatsArray(). It's + // straightforward to convert that to getStatsMap() form, less so to + // reconstruct the original order when converting the other way. + LLSD mData; }; -- cgit v1.3 From 01607fe418b19e7439020047c270c0e7c86725e7 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 30 Jun 2011 11:50:54 -0400 Subject: CHOP-753: Reduce redundancy in LLMemoryInfo. Recast stream() to display data from LLSD array rather than reinvoking OS operations used to capture it. Make refresh() cache LLSD data in map form as well as array; fetch items from that in a few places to avoid going back to OS. --- indra/llcommon/llsys.cpp | 159 ++++++++++++++++------------------------------- indra/llcommon/llsys.h | 10 +-- 2 files changed, 58 insertions(+), 111 deletions(-) (limited to 'indra/llcommon/llsys.h') diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index e4404f31c7..8222702c50 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -665,11 +665,7 @@ static U32 LLMemoryAdjustKBResult(U32 inKB) U32 LLMemoryInfo::getPhysicalMemoryKB() const { #if LL_WINDOWS - MEMORYSTATUSEX state; - state.dwLength = sizeof(state); - GlobalMemoryStatusEx(&state); - - return LLMemoryAdjustKBResult((U32)(state.ullTotalPhys >> 10)); + return LLMemoryAdjustKBResult(mStatsMap["Total Physical KB"]); #elif LL_DARWIN // This might work on Linux as well. Someone check... @@ -717,15 +713,11 @@ U32 LLMemoryInfo::getPhysicalMemoryClamped() const void LLMemoryInfo::getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb) { #if LL_WINDOWS - MEMORYSTATUSEX state; - state.dwLength = sizeof(state); - GlobalMemoryStatusEx(&state); - - avail_physical_mem_kb = (U32)(state.ullAvailPhys/1024) ; - avail_virtual_mem_kb = (U32)(state.ullAvailVirtual/1024) ; + avail_physical_mem_kb = mStatsMap["Avail Physical KB"]; + avail_virtual_mem_kb = mStatsMap["Avail Virtual KB"]; #elif LL_DARWIN - // Run vm_stat and filter output, scaling for page size: + // mStatsMap is derived from vm_stat, look for (e.g.) "kb free": // $ vm_stat // Mach Virtual Memory Statistics: (page size of 4096 bytes) // Pages free: 462078. @@ -743,7 +735,7 @@ void LLMemoryInfo::getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_v avail_virtual_mem_kb = -1 ; #elif LL_LINUX - // Read selected lines from MEMINFO_FILE: + // mStatsMap is derived from MEMINFO_FILE: // $ cat /proc/meminfo // MemTotal: 4108424 kB // MemFree: 1244064 kB @@ -811,114 +803,58 @@ void LLMemoryInfo::stream(std::ostream& s) const // introducer line, then read subsequent lines, etc... std::string pfx(LLError::utcTime() + " "); -#if LL_WINDOWS - MEMORYSTATUSEX state; - state.dwLength = sizeof(state); - GlobalMemoryStatusEx(&state); - - s << pfx << "Percent Memory use: " << (U32)state.dwMemoryLoad << '%' << std::endl; - s << pfx << "Total Physical KB: " << (U32)(state.ullTotalPhys/1024) << std::endl; - s << pfx << "Avail Physical KB: " << (U32)(state.ullAvailPhys/1024) << std::endl; - s << pfx << "Total page KB: " << (U32)(state.ullTotalPageFile/1024) << std::endl; - s << pfx << "Avail page KB: " << (U32)(state.ullAvailPageFile/1024) << std::endl; - s << pfx << "Total Virtual KB: " << (U32)(state.ullTotalVirtual/1024) << std::endl; - s << pfx << "Avail Virtual KB: " << (U32)(state.ullAvailVirtual/1024) << std::endl; - -#elif LL_DARWIN - uint64_t phys = 0; - - size_t len = sizeof(phys); - - if(sysctlbyname("hw.memsize", &phys, &len, NULL, 0) == 0) - { - s << pfx << "Total Physical KB: " << phys/1024 << std::endl; - } - else - { - s << "Unable to collect hw.memsize memory information" << std::endl; - } + // Most of the reason we even store mStatsArray is to preserve the + // original order in which we obtained these stats from the OS. So use + // mStatsArray in this method rather than mStatsMap, which should present + // the same information but in arbitrary order. - FILE* pout = popen("vm_stat 2>&1", "r"); - if (! pout) - { - s << "Unable to collect vm_stat memory information" << std::endl; - } - else + // Max key length + size_t key_width(0); + BOOST_FOREACH(LLSD pair, inArray(mStatsArray)) { - // Here 'pout' is vm_stat's stdout. Copy it to output stream. - char line[100]; - while (fgets(line, sizeof(line), pout)) + size_t len(pair[0].asString().length()); + if (len > key_width) { - s << pfx << line; + key_width = len; } - fclose(pout); } -#elif LL_SOLARIS - U64 phys = 0; - - phys = (U64)(sysconf(_SC_PHYS_PAGES)) * (U64)(sysconf(_SC_PAGESIZE)/1024); - - s << pfx << "Total Physical KB: " << phys << std::endl; - -#elif LL_LINUX - std::ifstream meminfo(MEMINFO_FILE); - if (meminfo.is_open()) - { - std::string line; - while (std::getline(meminfo, line)) - { - s << pfx << line << '\n'; - } - } - else + // Now stream stats + BOOST_FOREACH(LLSD pair, inArray(mStatsArray)) { - s << "Unable to collect memory information" << std::endl; + s << pfx << std::setw(key_width+1) << (pair[0].asString() + ':') + << ' ' + << std::setw(12) << pair[1].asInteger() << std::endl; } - -#else - s << "Unknown system; unable to collect memory information" << std::endl; - -#endif } LLSD LLMemoryInfo::getStatsMap() const { - LLSD map; - - BOOST_FOREACH(LLSD pair, inArray(mData)) - { - // Have to be clear that we want the key asString() to specify map - // indexing rather than array subscripting. - map[pair[0].asString()] = pair[1]; - } - - return map; + return mStatsMap; } LLSD LLMemoryInfo::getStatsArray() const { - return mData; + return mStatsArray; } LLMemoryInfo& LLMemoryInfo::refresh() { - // This implementation is derived from stream() code (as of 2011-06-29). - // Hopefully we'll reimplement stream() to use mData before long... - mData = LLSD::emptyArray(); + // This implementation is derived from stream() code (as of 2011-06-29). + mStatsArray = LLSD::emptyArray(); #if LL_WINDOWS MEMORYSTATUSEX state; state.dwLength = sizeof(state); GlobalMemoryStatusEx(&state); - mData.append(LLSDArray("Percent Memory use")(LLSD::Integer(state.dwMemoryLoad))); - mData.append(LLSDArray("Total Physical KB") (LLSD::Integer(state.ullTotalPhys/1024))); - mData.append(LLSDArray("Avail Physical KB") (LLSD::Integer(state.ullAvailPhys/1024))); - mData.append(LLSDArray("Total page KB") (LLSD::Integer(state.ullTotalPageFile/1024))); - mData.append(LLSDArray("Avail page KB") (LLSD::Integer(state.ullAvailPageFile/1024))); - mData.append(LLSDArray("Total Virtual KB") (LLSD::Integer(state.ullTotalVirtual/1024))); - mData.append(LLSDArray("Avail Virtual KB") (LLSD::Integer(state.ullAvailVirtual/1024))); + mStatsArray.append(LLSDArray("Percent Memory use")(LLSD::Integer(state.dwMemoryLoad))); + mStatsArray.append(LLSDArray("Total Physical KB") (LLSD::Integer(state.ullTotalPhys/1024))); + mStatsArray.append(LLSDArray("Avail Physical KB") (LLSD::Integer(state.ullAvailPhys/1024))); + mStatsArray.append(LLSDArray("Total page KB") (LLSD::Integer(state.ullTotalPageFile/1024))); + mStatsArray.append(LLSDArray("Avail page KB") (LLSD::Integer(state.ullAvailPageFile/1024))); + mStatsArray.append(LLSDArray("Total Virtual KB") (LLSD::Integer(state.ullTotalVirtual/1024))); + mStatsArray.append(LLSDArray("Avail Virtual KB") (LLSD::Integer(state.ullAvailVirtual/1024))); #elif LL_DARWIN uint64_t phys = 0; @@ -927,7 +863,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() if (sysctlbyname("hw.memsize", &phys, &len, NULL, 0) == 0) { - mData.append(LLSDArray("Total Physical KB")(LLSD::Integer(phys/1024))); + mStatsArray.append(LLSDArray("Total Physical KB")(LLSD::Integer(phys/1024))); } else { @@ -972,6 +908,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() { line[--linelen] = '\0'; } + LL_DEBUGS("LLMemoryInfo") << line << LL_ENDL; if (boost::regex_search(line, matched, pagesize_rx)) { // "Mach Virtual Memory Statistics: (page size of 4096 bytes)" @@ -988,7 +925,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() << "' in vm_stat line: " << line << LL_ENDL; continue; } - mData.append(LLSDArray("page size")(pagesizekb)); + mStatsArray.append(LLSDArray("page size")(pagesizekb)); } else if (boost::regex_match(line, matched, stat_rx)) { @@ -1014,7 +951,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() continue; } // Store this statistic. - mData.append(LLSDArray(key)(value)); + mStatsArray.append(LLSDArray(key)(value)); // Is this in units of pages? If so, convert to Kb. static const LLSD::String pages("Pages "); if (key.substr(0, pages.length()) == pages) @@ -1022,7 +959,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() // Synthesize a new key with kb in place of Pages LLSD::String kbkey("kb "); kbkey.append(key.substr(pages.length())); - mData.append(LLSDArray(kbkey)(value * pagesizekb)); + mStatsArray.append(LLSDArray(kbkey)(value * pagesizekb)); } } else if (boost::regex_match(line, matched, cache_rx)) @@ -1044,7 +981,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() << "' in vm_stat line: " << line << LL_ENDL; continue; } - mData.append(LLSDArray(cache_keys[i])(value)); + mStatsArray.append(LLSDArray(cache_keys[i])(value)); } } else @@ -1060,7 +997,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() phys = (U64)(sysconf(_SC_PHYS_PAGES)) * (U64)(sysconf(_SC_PAGESIZE)/1024); - mData.append(LLSDArray("Total Physical KB")(phys)); + mStatsArray.append(LLSDArray("Total Physical KB")(phys)); #elif LL_LINUX std::ifstream meminfo(MEMINFO_FILE); @@ -1092,6 +1029,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() std::string line; while (std::getline(meminfo, line)) { + LL_DEBUGS("LLMemoryInfo") << line << LL_ENDL; if (boost::regex_match(line, matched, stat_rx)) { // e.g. "MemTotal: 4108424 kB" @@ -1110,7 +1048,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() continue; } // Store this statistic. - mData.append(LLSDArray(key)(value)); + mStatsArray.append(LLSDArray(key)(value)); } else { @@ -1129,12 +1067,19 @@ LLMemoryInfo& LLMemoryInfo::refresh() #endif - // should become LL_DEBUGS when we're happy - LL_INFOS("LLMemoryInfo") << "Populated mData:\n"; - LLSDSerialize::toPrettyXML(mData, LL_CONT); - LL_ENDL; + // Recast same data as mStatsMap for easy access + BOOST_FOREACH(LLSD pair, inArray(mStatsArray)) + { + // Specify asString() to disambiguate map indexing from array + // subscripting. + mStatsMap[pair[0].asString()] = pair[1]; + } + + LL_DEBUGS("LLMemoryInfo") << "Populated mStatsMap:\n"; + LLSDSerialize::toPrettyXML(mStatsMap, LL_CONT); + LL_ENDL; - return *this; + return *this; } std::ostream& operator<<(std::ostream& s, const LLOSInfo& info) diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h index 5b44757e08..8565bfa0b9 100644 --- a/indra/llcommon/llsys.h +++ b/indra/llcommon/llsys.h @@ -141,10 +141,12 @@ public: LLMemoryInfo& refresh(); private: - // Internally, we store memory stats as for getStatsArray(). It's - // straightforward to convert that to getStatsMap() form, less so to - // reconstruct the original order when converting the other way. - LLSD mData; + // Memory stats for getStatsArray(). It's straightforward to convert that + // to getStatsMap() form, less so to reconstruct the original order when + // converting the other way. + LLSD mStatsArray; + // Memory stats for getStatsMap(). + LLSD mStatsMap; }; -- cgit v1.3 From abf50e8c7d3cf0bab46286f4b300c7d3be976775 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 30 Jun 2011 13:57:11 -0400 Subject: CHOP-753: Fix compile errors in LLMemoryInfo Windows-specific code. --- indra/llcommon/llsys.cpp | 72 ++++++++++++++++++++++++++++++------------------ indra/llcommon/llsys.h | 4 +++ 2 files changed, 49 insertions(+), 27 deletions(-) (limited to 'indra/llcommon/llsys.h') diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 8222702c50..d02a807000 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -665,7 +665,7 @@ static U32 LLMemoryAdjustKBResult(U32 inKB) U32 LLMemoryInfo::getPhysicalMemoryKB() const { #if LL_WINDOWS - return LLMemoryAdjustKBResult(mStatsMap["Total Physical KB"]); + return LLMemoryAdjustKBResult(mStatsMap["Total Physical KB"].asInteger()); #elif LL_DARWIN // This might work on Linux as well. Someone check... @@ -712,9 +712,13 @@ U32 LLMemoryInfo::getPhysicalMemoryClamped() const //static void LLMemoryInfo::getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb) { + // Sigh, this shouldn't be a static method, then we wouldn't have to + // reload this data separately from refresh() + LLSD statsMap(loadStatsMap(loadStatsArray())); + #if LL_WINDOWS - avail_physical_mem_kb = mStatsMap["Avail Physical KB"]; - avail_virtual_mem_kb = mStatsMap["Avail Virtual KB"]; + avail_physical_mem_kb = statsMap["Avail Physical KB"].asInteger(); + avail_virtual_mem_kb = statsMap["Avail Virtual KB"].asInteger(); #elif LL_DARWIN // mStatsMap is derived from vm_stat, look for (e.g.) "kb free": @@ -839,22 +843,35 @@ LLSD LLMemoryInfo::getStatsArray() const } LLMemoryInfo& LLMemoryInfo::refresh() +{ + mStatsArray = loadStatsArray(); + // Recast same data as mStatsMap for easy access + mStatsMap = loadStatsMap(mStatsArray); + + LL_DEBUGS("LLMemoryInfo") << "Populated mStatsMap:\n"; + LLSDSerialize::toPrettyXML(mStatsMap, LL_CONT); + LL_ENDL; + + return *this; +} + +LLSD LLMemoryInfo::loadStatsArray() { // This implementation is derived from stream() code (as of 2011-06-29). - mStatsArray = LLSD::emptyArray(); + LLSD statsArray(LLSD::emptyArray()); #if LL_WINDOWS MEMORYSTATUSEX state; state.dwLength = sizeof(state); GlobalMemoryStatusEx(&state); - mStatsArray.append(LLSDArray("Percent Memory use")(LLSD::Integer(state.dwMemoryLoad))); - mStatsArray.append(LLSDArray("Total Physical KB") (LLSD::Integer(state.ullTotalPhys/1024))); - mStatsArray.append(LLSDArray("Avail Physical KB") (LLSD::Integer(state.ullAvailPhys/1024))); - mStatsArray.append(LLSDArray("Total page KB") (LLSD::Integer(state.ullTotalPageFile/1024))); - mStatsArray.append(LLSDArray("Avail page KB") (LLSD::Integer(state.ullAvailPageFile/1024))); - mStatsArray.append(LLSDArray("Total Virtual KB") (LLSD::Integer(state.ullTotalVirtual/1024))); - mStatsArray.append(LLSDArray("Avail Virtual KB") (LLSD::Integer(state.ullAvailVirtual/1024))); + statsArray.append(LLSDArray("Percent Memory use")(LLSD::Integer(state.dwMemoryLoad))); + statsArray.append(LLSDArray("Total Physical KB") (LLSD::Integer(state.ullTotalPhys/1024))); + statsArray.append(LLSDArray("Avail Physical KB") (LLSD::Integer(state.ullAvailPhys/1024))); + statsArray.append(LLSDArray("Total page KB") (LLSD::Integer(state.ullTotalPageFile/1024))); + statsArray.append(LLSDArray("Avail page KB") (LLSD::Integer(state.ullAvailPageFile/1024))); + statsArray.append(LLSDArray("Total Virtual KB") (LLSD::Integer(state.ullTotalVirtual/1024))); + statsArray.append(LLSDArray("Avail Virtual KB") (LLSD::Integer(state.ullAvailVirtual/1024))); #elif LL_DARWIN uint64_t phys = 0; @@ -863,7 +880,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() if (sysctlbyname("hw.memsize", &phys, &len, NULL, 0) == 0) { - mStatsArray.append(LLSDArray("Total Physical KB")(LLSD::Integer(phys/1024))); + statsArray.append(LLSDArray("Total Physical KB")(LLSD::Integer(phys/1024))); } else { @@ -925,7 +942,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() << "' in vm_stat line: " << line << LL_ENDL; continue; } - mStatsArray.append(LLSDArray("page size")(pagesizekb)); + statsArray.append(LLSDArray("page size")(pagesizekb)); } else if (boost::regex_match(line, matched, stat_rx)) { @@ -951,7 +968,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() continue; } // Store this statistic. - mStatsArray.append(LLSDArray(key)(value)); + statsArray.append(LLSDArray(key)(value)); // Is this in units of pages? If so, convert to Kb. static const LLSD::String pages("Pages "); if (key.substr(0, pages.length()) == pages) @@ -959,7 +976,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() // Synthesize a new key with kb in place of Pages LLSD::String kbkey("kb "); kbkey.append(key.substr(pages.length())); - mStatsArray.append(LLSDArray(kbkey)(value * pagesizekb)); + statsArray.append(LLSDArray(kbkey)(value * pagesizekb)); } } else if (boost::regex_match(line, matched, cache_rx)) @@ -981,7 +998,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() << "' in vm_stat line: " << line << LL_ENDL; continue; } - mStatsArray.append(LLSDArray(cache_keys[i])(value)); + statsArray.append(LLSDArray(cache_keys[i])(value)); } } else @@ -997,7 +1014,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() phys = (U64)(sysconf(_SC_PHYS_PAGES)) * (U64)(sysconf(_SC_PAGESIZE)/1024); - mStatsArray.append(LLSDArray("Total Physical KB")(phys)); + statsArray.append(LLSDArray("Total Physical KB")(phys)); #elif LL_LINUX std::ifstream meminfo(MEMINFO_FILE); @@ -1048,7 +1065,7 @@ LLMemoryInfo& LLMemoryInfo::refresh() continue; } // Store this statistic. - mStatsArray.append(LLSDArray(key)(value)); + statsArray.append(LLSDArray(key)(value)); } else { @@ -1067,19 +1084,20 @@ LLMemoryInfo& LLMemoryInfo::refresh() #endif - // Recast same data as mStatsMap for easy access - BOOST_FOREACH(LLSD pair, inArray(mStatsArray)) + return statsArray; +} + +LLSD LLMemoryInfo::loadStatsMap(const LLSD& statsArray) +{ + LLSD statsMap; + + BOOST_FOREACH(LLSD pair, inArray(statsArray)) { // Specify asString() to disambiguate map indexing from array // subscripting. - mStatsMap[pair[0].asString()] = pair[1]; + statsMap[pair[0].asString()] = pair[1]; } - - LL_DEBUGS("LLMemoryInfo") << "Populated mStatsMap:\n"; - LLSDSerialize::toPrettyXML(mStatsMap, LL_CONT); - LL_ENDL; - - return *this; + return statsMap; } std::ostream& operator<<(std::ostream& s, const LLOSInfo& info) diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h index 8565bfa0b9..7fcb050ed0 100644 --- a/indra/llcommon/llsys.h +++ b/indra/llcommon/llsys.h @@ -141,6 +141,10 @@ public: LLMemoryInfo& refresh(); private: + // These methods are used to set mStatsArray and mStatsMap. + static LLSD loadStatsArray(); + static LLSD loadStatsMap(const LLSD&); + // Memory stats for getStatsArray(). It's straightforward to convert that // to getStatsMap() form, less so to reconstruct the original order when // converting the other way. -- cgit v1.3 From ed648b1f08a191250c5c37f831280c31950b502a Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 12 Jul 2011 20:14:39 -0400 Subject: CHOP-753: Eliminate redundant array-of-pair-arrays in LLMemoryInfo. (per Monty code review) The notion of storing LLMemoryInfo data both as an LLSD::Map and an LLSD::Array of pair arrays arose from a (possibly misguided) desire to continue producing stats output into the viewer log in the same order it always used to be produced. There is no evidence that anyone cares about the order of those stats in the log; there is no other use case for preserving order. At Monty's recommendation, eliminate generating and storing the array-of-pair-arrays form: directly store LLSD::Map. --- indra/llcommon/llsys.cpp | 72 ++++++++++++++++-------------------------------- indra/llcommon/llsys.h | 24 ++++------------ 2 files changed, 30 insertions(+), 66 deletions(-) (limited to 'indra/llcommon/llsys.h') diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index ebdef56c2a..99e61433c6 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -647,13 +647,13 @@ void LLCPUInfo::stream(std::ostream& s) const s << "->mCPUString: " << mCPUString << std::endl; } -// Helper class for LLMemoryInfo: accumulate stats in the array-of-pair-arrays -// form we store for LLMemoryInfo::getStatsArray(). -class StatsArray +// Helper class for LLMemoryInfo: accumulate stats in the form we store for +// LLMemoryInfo::getStatsMap(). +class Stats { public: - StatsArray(): - mStats(LLSD::emptyArray()) + Stats(): + mStats(LLSD::emptyMap()) {} // Store every integer type as LLSD::Integer. @@ -661,7 +661,7 @@ public: void add(const LLSD::String& name, const T& value, typename boost::enable_if >::type* = 0) { - mStats.append(LLSDArray(name)(LLSD::Integer(value))); + mStats[name] = LLSD::Integer(value); } // Store every floating-point type as LLSD::Real. @@ -669,13 +669,13 @@ public: void add(const LLSD::String& name, const T& value, typename boost::enable_if >::type* = 0) { - mStats.append(LLSDArray(name)(LLSD::Real(value))); + mStats[name] = LLSD::Real(value); } // Hope that LLSD::Date values are sufficiently unambiguous. void add(const LLSD::String& name, const LLSD::Date& value) { - mStats.append(LLSDArray(name)(value)); + mStats[name] = value; } LLSD get() const { return mStats; } @@ -792,7 +792,7 @@ void LLMemoryInfo::getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_v #if LL_WINDOWS // Sigh, this shouldn't be a static method, then we wouldn't have to // reload this data separately from refresh() - LLSD statsMap(loadStatsMap(loadStatsArray())); + LLSD statsMap(loadStatsMap()); avail_physical_mem_kb = statsMap["Avail Physical KB"].asInteger(); avail_virtual_mem_kb = statsMap["Avail Virtual KB"].asInteger(); @@ -884,16 +884,11 @@ void LLMemoryInfo::stream(std::ostream& s) const // introducer line, then read subsequent lines, etc... std::string pfx(LLError::utcTime() + " "); - // Most of the reason we even store mStatsArray is to preserve the - // original order in which we obtained these stats from the OS. So use - // mStatsArray in this method rather than mStatsMap, which should present - // the same information but in arbitrary order. - // Max key length size_t key_width(0); - BOOST_FOREACH(LLSD pair, inArray(mStatsArray)) + BOOST_FOREACH(const MapEntry& pair, inMap(mStatsMap)) { - size_t len(pair[0].asString().length()); + size_t len(pair.first.length()); if (len > key_width) { key_width = len; @@ -901,17 +896,18 @@ void LLMemoryInfo::stream(std::ostream& s) const } // Now stream stats - BOOST_FOREACH(LLSD pair, inArray(mStatsArray)) + BOOST_FOREACH(const MapEntry& pair, inMap(mStatsMap)) { - s << pfx << std::setw(key_width+1) << (pair[0].asString() + ':') << ' '; - if (pair[1].isInteger()) - s << std::setw(12) << pair[1].asInteger(); - else if (pair[1].isReal()) - s << std::fixed << std::setprecision(1) << pair[1].asReal(); - else if (pair[1].isDate()) - pair[1].asDate().toStream(s); + s << pfx << std::setw(key_width+1) << (pair.first + ':') << ' '; + LLSD value(pair.second); + if (value.isInteger()) + s << std::setw(12) << value.asInteger(); + else if (value.isReal()) + s << std::fixed << std::setprecision(1) << value.asReal(); + else if (value.isDate()) + value.asDate().toStream(s); else - s << pair[1]; // just use default LLSD formatting + s << value; // just use default LLSD formatting s << std::endl; } } @@ -921,16 +917,9 @@ LLSD LLMemoryInfo::getStatsMap() const return mStatsMap; } -LLSD LLMemoryInfo::getStatsArray() const -{ - return mStatsArray; -} - LLMemoryInfo& LLMemoryInfo::refresh() { - mStatsArray = loadStatsArray(); - // Recast same data as mStatsMap for easy access - mStatsMap = loadStatsMap(mStatsArray); + mStatsMap = loadStatsMap(); LL_DEBUGS("LLMemoryInfo") << "Populated mStatsMap:\n"; LLSDSerialize::toPrettyXML(mStatsMap, LL_CONT); @@ -939,10 +928,10 @@ LLMemoryInfo& LLMemoryInfo::refresh() return *this; } -LLSD LLMemoryInfo::loadStatsArray() +LLSD LLMemoryInfo::loadStatsMap() { // This implementation is derived from stream() code (as of 2011-06-29). - StatsArray stats; + Stats stats; // associate timestamp for analysis over time stats.add("timestamp", LLDate::now()); @@ -1274,19 +1263,6 @@ LLSD LLMemoryInfo::loadStatsArray() return stats.get(); } -LLSD LLMemoryInfo::loadStatsMap(const LLSD& statsArray) -{ - LLSD statsMap; - - BOOST_FOREACH(LLSD pair, inArray(statsArray)) - { - // Specify asString() to disambiguate map indexing from array - // subscripting. - statsMap[pair[0].asString()] = pair[1]; - } - return statsMap; -} - std::ostream& operator<<(std::ostream& s, const LLOSInfo& info) { info.stream(s); diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h index 7fcb050ed0..739e795d3a 100644 --- a/indra/llcommon/llsys.h +++ b/indra/llcommon/llsys.h @@ -120,35 +120,23 @@ public: static void getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb); // Retrieve a map of memory statistics. The keys of the map are platform- - // dependent. The values are in kilobytes. + // dependent. The values are in kilobytes to try to avoid integer overflow. LLSD getStatsMap() const; - // Retrieve memory statistics: an array of pair arrays [name, value]. This - // is the same data as presented in getStatsMap(), but it preserves the - // order in which we retrieved it from the OS in case that's useful. The - // set of statistics names is platform-dependent. The values are in - // kilobytes to try to avoid integer overflow. - LLSD getStatsArray() const; - - // Re-fetch memory data (as reported by stream() and getStats*()) from the + // Re-fetch memory data (as reported by stream() and getStatsMap()) from the // system. Normally this is fetched at construction time. Return (*this) // to permit usage of the form: // @code // LLMemoryInfo info; // ... - // info.refresh().getStatsArray(); + // info.refresh().getStatsMap(); // @endcode LLMemoryInfo& refresh(); private: - // These methods are used to set mStatsArray and mStatsMap. - static LLSD loadStatsArray(); - static LLSD loadStatsMap(const LLSD&); - - // Memory stats for getStatsArray(). It's straightforward to convert that - // to getStatsMap() form, less so to reconstruct the original order when - // converting the other way. - LLSD mStatsArray; + // set mStatsMap + static LLSD loadStatsMap(); + // Memory stats for getStatsMap(). LLSD mStatsMap; }; -- cgit v1.3