Index: net/ssl/ssl_client_session_cache.cc |
diff --git a/net/ssl/ssl_client_session_cache.cc b/net/ssl/ssl_client_session_cache.cc |
index fc817fdba0b410f37294f964c63be70d6e7753c4..4f40e23a7f1c6f5d163089c3623a4cd1384c4c6f 100644 |
--- a/net/ssl/ssl_client_session_cache.cc |
+++ b/net/ssl/ssl_client_session_cache.cc |
@@ -4,11 +4,16 @@ |
#include "net/ssl/ssl_client_session_cache.h" |
+#include <openssl/ssl.h> |
+#include <openssl/x509.h> |
#include <utility> |
#include "base/memory/memory_coordinator_client_registry.h" |
+#include "base/strings/stringprintf.h" |
#include "base/time/clock.h" |
#include "base/time/default_clock.h" |
+#include "base/trace_event/process_memory_dump.h" |
+#include "net/cert/x509_util_openssl.h" |
#include "third_party/boringssl/src/include/openssl/ssl.h" |
namespace net { |
@@ -82,6 +87,45 @@ bool SSLClientSessionCache::IsExpired(SSL_SESSION* session, time_t now) { |
SSL_SESSION_get_time(session) + SSL_SESSION_get_timeout(session); |
} |
+void SSLClientSessionCache::DumpMemoryStats( |
+ base::trace_event::ProcessMemoryDump* pmd) { |
+ base::AutoLock lock(lock_); |
eroman
2016/12/02 00:27:24
Can the lock acquisition be moved to after CreateA
xunjieli
2016/12/02 15:31:34
Done.
|
+ |
+ std::string absolute_name = "net/ssl_session_cache"; |
+ base::trace_event::MemoryAllocatorDump* cache_dump = |
+ pmd->GetAllocatorDump(absolute_name); |
+ // This method can be reached from different URLRequestContexts. Since this is |
+ // a singleton, only log memory stats once. |
+ if (cache_dump) |
+ return; |
+ cache_dump = pmd->CreateAllocatorDump(absolute_name); |
+ auto iter = cache_.begin(); |
+ while (iter != cache_.end()) { |
+ auto entry = iter->second.get(); |
+ auto cert_chain = entry->x509_chain; |
+ size_t cert_count = sk_X509_num(cert_chain); |
+ base::trace_event::MemoryAllocatorDump* entry_dump = |
+ pmd->CreateAllocatorDump( |
+ base::StringPrintf("%s/entry_%p", absolute_name.c_str(), entry)); |
+ int cert_size = 0; |
+ for (size_t i = 0; i < cert_count; ++i) { |
+ X509* cert = sk_X509_value(cert_chain, i); |
+ cert_size += i2d_X509(cert, nullptr); |
+ } |
+ entry_dump->AddScalar("cert_size", |
+ base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
+ cert_size); |
+ entry_dump->AddScalar("cert_count", |
+ base::trace_event::MemoryAllocatorDump::kUnitsObjects, |
+ cert_count); |
+ entry_dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, |
+ base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
+ cert_size); |
+ |
+ ++iter; |
+ } |
+} |
+ |
void SSLClientSessionCache::FlushExpiredSessions() { |
time_t now = clock_->Now().ToTimeT(); |
auto iter = cache_.begin(); |