Chromium Code Reviews| Index: sql/connection.cc |
| diff --git a/sql/connection.cc b/sql/connection.cc |
| index 9daa7d1c3b1c4be221d33ec8aadb15b7d37d2091..003005a8e6294247df3d5bbea887a54ccd365cd7 100644 |
| --- a/sql/connection.cc |
| +++ b/sql/connection.cc |
| @@ -27,7 +27,7 @@ |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/synchronization/lock.h" |
| #include "base/trace_event/memory_dump_manager.h" |
| -#include "base/trace_event/process_memory_dump.h" |
| +#include "sql/connection_memory_dump_provider.h" |
| #include "sql/meta_table.h" |
| #include "sql/statement.h" |
| #include "third_party/sqlite/sqlite3.h" |
| @@ -254,44 +254,6 @@ bool Connection::ShouldIgnoreSqliteCompileError(int error) { |
| basic_error == SQLITE_CORRUPT; |
| } |
| -bool Connection::OnMemoryDump(const base::trace_event::MemoryDumpArgs& args, |
| - base::trace_event::ProcessMemoryDump* pmd) { |
| - if (args.level_of_detail == |
| - base::trace_event::MemoryDumpLevelOfDetail::LIGHT || |
| - !db_) { |
| - return true; |
| - } |
| - |
| - // The high water mark is not tracked for the following usages. |
| - int cache_size, dummy_int; |
| - sqlite3_db_status(db_, SQLITE_DBSTATUS_CACHE_USED, &cache_size, &dummy_int, |
| - 0 /* resetFlag */); |
| - int schema_size; |
| - sqlite3_db_status(db_, SQLITE_DBSTATUS_SCHEMA_USED, &schema_size, &dummy_int, |
| - 0 /* resetFlag */); |
| - int statement_size; |
| - sqlite3_db_status(db_, SQLITE_DBSTATUS_STMT_USED, &statement_size, &dummy_int, |
| - 0 /* resetFlag */); |
| - |
| - std::string name = base::StringPrintf( |
| - "sqlite/%s_connection/%p", |
| - histogram_tag_.empty() ? "Unknown" : histogram_tag_.c_str(), this); |
| - base::trace_event::MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(name); |
| - dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, |
| - base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
| - cache_size + schema_size + statement_size); |
| - dump->AddScalar("cache_size", |
| - base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
| - cache_size); |
| - dump->AddScalar("schema_size", |
| - base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
| - schema_size); |
| - dump->AddScalar("statement_size", |
| - base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
| - statement_size); |
| - return true; |
| -} |
| - |
| void Connection::ReportDiagnosticInfo(int extended_error, Statement* stmt) { |
| AssertIOAllowed(); |
| @@ -386,13 +348,9 @@ Connection::Connection() |
| update_time_histogram_(NULL), |
| query_time_histogram_(NULL), |
| clock_(new TimeSource()) { |
| - base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( |
| - this, "sql::Connection", nullptr); |
| } |
| Connection::~Connection() { |
| - base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( |
| - this); |
| Close(); |
| } |
| @@ -511,6 +469,17 @@ void Connection::CloseInternal(bool forced) { |
| // of the function. http://crbug.com/136655. |
| AssertIOAllowed(); |
| + // Reseting acquires a lock to ensure no dump is happening on the database |
| + // at the same time. Unregister takes ownership of provider and it is safe |
| + // since the db is reset. memory_dump_provider_ could be null if db_ was |
| + // poisoned. |
| + if (memory_dump_provider_) { |
| + memory_dump_provider_->ResetDatabase(); |
| + base::trace_event::MemoryDumpManager::GetInstance() |
| + ->UnregisterAndDeleteDumpProviderSoon( |
| + std::move(memory_dump_provider_)); |
| + } |
|
Scott Hess - ex-Googler
2016/01/12 19:33:14
OK, reasoning this out, a dump before the reset is
Primiano Tucci (use gerrit)
2016/01/12 19:38:02
Yup, this reasoning matches perfectly ours :)
|
| + |
| int rc = sqlite3_close(db_); |
| if (rc != SQLITE_OK) { |
| UMA_HISTOGRAM_SPARSE_SLOWLY("Sqlite.CloseFailure", rc); |
| @@ -1848,6 +1817,12 @@ bool Connection::OpenInternal(const std::string& file_name, |
| mmap_enabled_ = true; |
| } |
| + DCHECK(!memory_dump_provider_); |
| + memory_dump_provider_.reset( |
| + new ConnectionMemoryDumpProvider(db_, histogram_tag_)); |
| + base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( |
| + memory_dump_provider_.get(), "sql::Connection", nullptr); |
| + |
| return true; |
| } |