Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "sql/connection.h" | 5 #include "sql/connection.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| 11 #include "base/files/file_util.h" | 11 #include "base/files/file_util.h" |
| 12 #include "base/lazy_instance.h" | 12 #include "base/lazy_instance.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/message_loop/message_loop.h" | 14 #include "base/message_loop/message_loop.h" |
| 15 #include "base/metrics/histogram.h" | 15 #include "base/metrics/histogram.h" |
| 16 #include "base/metrics/sparse_histogram.h" | 16 #include "base/metrics/sparse_histogram.h" |
| 17 #include "base/strings/string_split.h" | 17 #include "base/strings/string_split.h" |
| 18 #include "base/strings/string_util.h" | 18 #include "base/strings/string_util.h" |
| 19 #include "base/strings/stringprintf.h" | 19 #include "base/strings/stringprintf.h" |
| 20 #include "base/strings/utf_string_conversions.h" | 20 #include "base/strings/utf_string_conversions.h" |
| 21 #include "base/synchronization/lock.h" | 21 #include "base/synchronization/lock.h" |
| 22 #include "base/trace_event/memory_dump_manager.h" | |
| 23 #include "base/trace_event/process_memory_dump.h" | |
| 22 #include "sql/statement.h" | 24 #include "sql/statement.h" |
| 23 #include "third_party/sqlite/sqlite3.h" | 25 #include "third_party/sqlite/sqlite3.h" |
| 24 | 26 |
| 25 #if defined(OS_IOS) && defined(USE_SYSTEM_SQLITE) | 27 #if defined(OS_IOS) && defined(USE_SYSTEM_SQLITE) |
| 26 #include "third_party/sqlite/src/ext/icu/sqliteicu.h" | 28 #include "third_party/sqlite/src/ext/icu/sqliteicu.h" |
| 27 #endif | 29 #endif |
| 28 | 30 |
| 29 namespace { | 31 namespace { |
| 30 | 32 |
| 31 // Spin for up to a second waiting for the lock to clear when setting | 33 // Spin for up to a second waiting for the lock to clear when setting |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 210 // static | 212 // static |
| 211 Connection::ErrorIgnorerCallback* Connection::current_ignorer_cb_ = NULL; | 213 Connection::ErrorIgnorerCallback* Connection::current_ignorer_cb_ = NULL; |
| 212 | 214 |
| 213 // static | 215 // static |
| 214 bool Connection::ShouldIgnoreSqliteError(int error) { | 216 bool Connection::ShouldIgnoreSqliteError(int error) { |
| 215 if (!current_ignorer_cb_) | 217 if (!current_ignorer_cb_) |
| 216 return false; | 218 return false; |
| 217 return current_ignorer_cb_->Run(error); | 219 return current_ignorer_cb_->Run(error); |
| 218 } | 220 } |
| 219 | 221 |
| 222 bool Connection::OnMemoryDump(const base::trace_event::MemoryDumpArgs& args, | |
|
michaeln
2015/10/15 23:03:28
what prevents this method from being called after
Scott Hess - ex-Googler
2015/10/15 23:50:29
~Connection unregisters, and the !db_ test below s
Primiano Tucci (use gerrit)
2015/10/16 08:37:44
As long as the dtor happens on the same thread of
| |
| 223 base::trace_event::ProcessMemoryDump* pmd) { | |
| 224 if (args.level_of_detail == | |
| 225 base::trace_event::MemoryDumpLevelOfDetail::LIGHT || | |
| 226 !db_) { | |
| 227 return true; | |
| 228 } | |
| 229 | |
| 230 // The high water mark is not tracked for the following usages. | |
| 231 int cache_size, dummy_int; | |
| 232 sqlite3_db_status(db_, SQLITE_DBSTATUS_CACHE_USED, &cache_size, &dummy_int, | |
| 233 0 /* resetFlag */); | |
| 234 int schema_size; | |
| 235 sqlite3_db_status(db_, SQLITE_DBSTATUS_SCHEMA_USED, &schema_size, &dummy_int, | |
| 236 0 /* resetFlag */); | |
| 237 int statement_size; | |
| 238 sqlite3_db_status(db_, SQLITE_DBSTATUS_STMT_USED, &statement_size, &dummy_int, | |
| 239 0 /* resetFlag */); | |
| 240 | |
| 241 std::string name = base::StringPrintf( | |
| 242 "sqlite/%s_connection/%p", | |
| 243 histogram_tag_.empty() ? "Unknown" : histogram_tag_.c_str(), this); | |
| 244 base::trace_event::MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(name); | |
| 245 dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, | |
| 246 base::trace_event::MemoryAllocatorDump::kUnitsBytes, | |
| 247 cache_size + schema_size + statement_size); | |
| 248 dump->AddScalar("cache_size", | |
| 249 base::trace_event::MemoryAllocatorDump::kUnitsBytes, | |
| 250 cache_size); | |
| 251 dump->AddScalar("schema_size", | |
| 252 base::trace_event::MemoryAllocatorDump::kUnitsBytes, | |
| 253 schema_size); | |
| 254 dump->AddScalar("statement_size", | |
| 255 base::trace_event::MemoryAllocatorDump::kUnitsBytes, | |
| 256 statement_size); | |
| 257 return true; | |
| 258 } | |
| 259 | |
| 220 // static | 260 // static |
| 221 void Connection::SetErrorIgnorer(Connection::ErrorIgnorerCallback* cb) { | 261 void Connection::SetErrorIgnorer(Connection::ErrorIgnorerCallback* cb) { |
| 222 CHECK(current_ignorer_cb_ == NULL); | 262 CHECK(current_ignorer_cb_ == NULL); |
| 223 current_ignorer_cb_ = cb; | 263 current_ignorer_cb_ = cb; |
| 224 } | 264 } |
| 225 | 265 |
| 226 // static | 266 // static |
| 227 void Connection::ResetErrorIgnorer() { | 267 void Connection::ResetErrorIgnorer() { |
| 228 CHECK(current_ignorer_cb_); | 268 CHECK(current_ignorer_cb_); |
| 229 current_ignorer_cb_ = NULL; | 269 current_ignorer_cb_ = NULL; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 284 poisoned_(false), | 324 poisoned_(false), |
| 285 mmap_disabled_(false), | 325 mmap_disabled_(false), |
| 286 mmap_enabled_(false), | 326 mmap_enabled_(false), |
| 287 total_changes_at_last_release_(0), | 327 total_changes_at_last_release_(0), |
| 288 stats_histogram_(NULL), | 328 stats_histogram_(NULL), |
| 289 commit_time_histogram_(NULL), | 329 commit_time_histogram_(NULL), |
| 290 autocommit_time_histogram_(NULL), | 330 autocommit_time_histogram_(NULL), |
| 291 update_time_histogram_(NULL), | 331 update_time_histogram_(NULL), |
| 292 query_time_histogram_(NULL), | 332 query_time_histogram_(NULL), |
| 293 clock_(new TimeSource()) { | 333 clock_(new TimeSource()) { |
| 334 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( | |
| 335 this); | |
| 294 } | 336 } |
| 295 | 337 |
| 296 Connection::~Connection() { | 338 Connection::~Connection() { |
| 339 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( | |
| 340 this); | |
| 297 Close(); | 341 Close(); |
| 298 } | 342 } |
| 299 | 343 |
| 300 void Connection::RecordEvent(Events event, size_t count) { | 344 void Connection::RecordEvent(Events event, size_t count) { |
| 301 for (size_t i = 0; i < count; ++i) { | 345 for (size_t i = 0; i < count; ++i) { |
| 302 UMA_HISTOGRAM_ENUMERATION("Sqlite.Stats", event, EVENT_MAX_VALUE); | 346 UMA_HISTOGRAM_ENUMERATION("Sqlite.Stats", event, EVENT_MAX_VALUE); |
| 303 } | 347 } |
| 304 | 348 |
| 305 if (stats_histogram_) { | 349 if (stats_histogram_) { |
| 306 for (size_t i = 0; i < count; ++i) { | 350 for (size_t i = 0; i < count; ++i) { |
| (...skipping 1176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1483 ignore_result(Execute(kNoWritableSchema)); | 1527 ignore_result(Execute(kNoWritableSchema)); |
| 1484 | 1528 |
| 1485 return ret; | 1529 return ret; |
| 1486 } | 1530 } |
| 1487 | 1531 |
| 1488 base::TimeTicks TimeSource::Now() { | 1532 base::TimeTicks TimeSource::Now() { |
| 1489 return base::TimeTicks::Now(); | 1533 return base::TimeTicks::Now(); |
| 1490 } | 1534 } |
| 1491 | 1535 |
| 1492 } // namespace sql | 1536 } // namespace sql |
| OLD | NEW |