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..5fd3c481ef02777906092a07e166405f2646e408 100644 |
--- a/net/ssl/ssl_client_session_cache.cc |
+++ b/net/ssl/ssl_client_session_cache.cc |
@@ -7,9 +7,13 @@ |
#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" |
+#include "third_party/boringssl/src/include/openssl/x509.h" |
namespace net { |
@@ -82,6 +86,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) { |
+ 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. |
+ // TODO(xunjieli): Change this once crbug.com/458365 is fixed. |
+ if (cache_dump) |
+ return; |
+ cache_dump = pmd->CreateAllocatorDump(absolute_name); |
+ base::AutoLock lock(lock_); |
+ for (const auto& pair : cache_) { |
+ auto entry = pair.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); |
+ } |
+ // This measures the lower bound of the serialized certificate. It doesn't |
+ // measure the actual memory used, which is 4x this amount (see |
+ // crbug.com/671420 for more details). |
+ entry_dump->AddScalar("cert_size", |
+ base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
+ cert_size); |
+ entry_dump->AddScalar("serialized_cert_count", |
+ base::trace_event::MemoryAllocatorDump::kUnitsObjects, |
+ cert_count); |
+ entry_dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, |
+ base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
+ cert_size); |
+ } |
+} |
+ |
void SSLClientSessionCache::FlushExpiredSessions() { |
time_t now = clock_->Now().ToTimeT(); |
auto iter = cache_.begin(); |