Index: chrome/browser/chromeos/system/syslogs_provider.cc |
diff --git a/chrome/browser/chromeos/system/syslogs_provider.cc b/chrome/browser/chromeos/system/syslogs_provider.cc |
index 57c76cfeb9dd5cdb4dce8cc5ca775b1d8d1059bf..b26624c6d67bc21189c87e81d1ba9304a3dfdb6d 100644 |
--- a/chrome/browser/chromeos/system/syslogs_provider.cc |
+++ b/chrome/browser/chromeos/system/syslogs_provider.cc |
@@ -4,6 +4,9 @@ |
#include "chrome/browser/chromeos/system/syslogs_provider.h" |
+#include <functional> |
+#include <set> |
+ |
#include "base/command_line.h" |
#include "base/file_path.h" |
#include "base/file_util.h" |
@@ -11,6 +14,8 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/memory/singleton.h" |
#include "base/string_util.h" |
+#include "base/utf_string_conversions.h" |
+#include "chrome/browser/memory_details.h" |
#include "chrome/common/chrome_switches.h" |
#include "content/browser/browser_thread.h" |
@@ -219,6 +224,78 @@ CancelableRequestProvider::Handle SyslogsProviderImpl::RequestSyslogs( |
return request->handle(); |
} |
stevenjb
2011/08/03 01:55:20
Actual new code.
|
+// Derived class from memoryDetails converts the results into a single string |
+// and adds a "mem_usage" entry to the logs, then forwards the result. |
+// Format of entry is (one process per line, reverse-sorted by size): |
+// Tab [Title1|Title2]: 50 MB |
+// Browser: 30 MB |
+// Tab [Title]: 20 MB |
+// Extension [Title]: 10 MB |
+// ... |
+class SyslogsMemoryHandler : public MemoryDetails { |
+ public: |
+ typedef SyslogsProvider::ReadCompleteCallback ReadCompleteCallback; |
+ |
+ // |logs| is modified (see comment above) and passed to |request|. |
+ // |zip_content| is passed to |request|. |
+ SyslogsMemoryHandler( |
+ scoped_refptr<CancelableRequest<ReadCompleteCallback> > request, |
+ LogDictionaryType* logs, |
+ std::string* zip_content) |
+ : request_(request), |
+ logs_(logs), |
+ zip_content_(zip_content) { |
+ } |
+ |
+ virtual void OnDetailsAvailable() OVERRIDE { |
+ const ProcessData& chrome = processes()[0]; // Chrome is the first entry. |
+ // Process info, sorted by memory used (highest to lowest). |
+ typedef std::pair<size_t, std::string> ProcInfo; |
+ typedef std::set<ProcInfo, std::greater<ProcInfo> > ProcInfoSet; |
+ ProcInfoSet process_info; |
+ for (ProcessMemoryInformationList::const_iterator iter1 = |
+ chrome.processes.begin(); |
+ iter1 != chrome.processes.end(); ++iter1) { |
+ std::string process_string( |
+ ChildProcessInfo::GetFullTypeNameInEnglish( |
+ iter1->type, iter1->renderer_type)); |
+ if (!iter1->titles.empty()) { |
+ std::string titles(" ["); |
+ for (std::vector<string16>::const_iterator iter2 = |
+ iter1->titles.begin(); |
+ iter2 != iter1->titles.end(); ++iter2) { |
+ if (iter2 != iter1->titles.begin()) |
+ titles += "|"; |
+ titles += UTF16ToUTF8(*iter2); |
+ } |
+ titles += "]"; |
+ process_string += titles; |
+ } |
+ // Use private working set for memory used calculation. |
+ size_t ws_bytes = iter1->working_set.priv / 1024; |
James Cook
2011/08/03 17:06:49
If you're dividing by 1024, this isn't bytes. ws_
stevenjb
2011/08/03 19:11:39
Done.
|
+ process_info.insert(std::make_pair(ws_bytes, process_string)); |
+ } |
+ // Add one line for each reverse-sorted entry. |
+ std::string mem_string; |
+ for (ProcInfoSet::iterator iter = process_info.begin(); |
+ iter != process_info.end(); ++iter) { |
+ mem_string += iter->second + StringPrintf(": %u MB", iter->first) + "\n"; |
+ } |
+ (*logs_)["mem_usage"] = mem_string; |
+ // This will call the callback on the calling thread. |
+ request_->ForwardResult( |
+ Tuple2<LogDictionaryType*, std::string*>(logs_, zip_content_)); |
+ } |
+ |
+ private: |
+ virtual ~SyslogsMemoryHandler() {} |
+ |
+ scoped_refptr<CancelableRequest<ReadCompleteCallback> > request_; |
+ LogDictionaryType* logs_; |
+ std::string* zip_content_; |
+ DISALLOW_COPY_AND_ASSIGN(SyslogsMemoryHandler); |
+}; |
+ |
// Called from FILE thread. |
void SyslogsProviderImpl::ReadSyslogs( |
scoped_refptr<CancelableRequest<ReadCompleteCallback> > request, |
@@ -253,12 +330,14 @@ void SyslogsProviderImpl::ReadSyslogs( |
file_util::Delete(zip_file, false); |
} |
- // Will call the callback on the calling thread. |
- request->ForwardResult(Tuple2<LogDictionaryType*, |
- std::string*>(logs, zip_content)); |
+ // SyslogsMemoryHandler will clean itself up. |
+ // SyslogsMemoryHandler::OnDetailsAvailable() will modify |logs| and call |
+ // request->ForwardResult(logs, zip_content). |
+ scoped_refptr<SyslogsMemoryHandler> |
+ handler(new SyslogsMemoryHandler(request, logs, zip_content)); |
+ handler->StartFetch(); |
} |
- |
void SyslogsProviderImpl::LoadCompressedLogs(const FilePath& zip_file, |
std::string* zip_content) { |
DCHECK(zip_content); |