| // Copyright 2018 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "sql/initialization.h" | |
| #include "base/bind.h" | |
| #include "base/metrics/histogram_macros.h" | |
| #include "base/no_destructor.h" | |
| #include "base/numerics/safe_conversions.h" | |
| #include "base/threading/sequenced_task_runner_handle.h" | |
| #include "build/build_config.h" | |
| #include "third_party/sqlite/sqlite3.h" | |
| namespace sql { | |
| namespace { | |
| #if !defined(OS_IOS) | |
| void RecordSqliteMemory10Min() { | |
| const int32_t used = | |
| base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024); | |
| UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.TenMinutes", used); | |
| } | |
| void RecordSqliteMemoryHour() { | |
| const int32_t used = | |
| base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024); | |
| UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.OneHour", used); | |
| } | |
| void RecordSqliteMemoryDay() { | |
| const int32_t used = | |
| base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024); | |
| UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.OneDay", used); | |
| } | |
| void RecordSqliteMemoryWeek() { | |
| const int32_t used = | |
| base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024); | |
| UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.OneWeek", used); | |
| } | |
| #endif // !defined(OS_IOS) | |
| } // anonymous namespace | |
| void EnsureSqliteInitialized() { | |
| // sqlite3_initialize() uses double-checked locking and thus can have | |
| // data races. | |
| static base::NoDestructor<base::Lock> sqlite_init_lock; | |
| base::AutoLock auto_lock(*sqlite_init_lock); | |
| static bool first_call = true; | |
| if (first_call) { | |
| sqlite3_initialize(); | |
| #if !defined(OS_IOS) | |
| // Schedule callback to record memory footprint histograms at 10m, 1h, and | |
| // 1d. There may not be a registered task runner in tests. | |
| // TODO(crbug.com/861889): Disable very long critical tasks on iOS until | |
| // 861889 is fixed. | |
| if (base::SequencedTaskRunnerHandle::IsSet()) { | |
| base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( | |
| FROM_HERE, base::BindOnce(&RecordSqliteMemory10Min), | |
| base::TimeDelta::FromMinutes(10)); | |
| base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( | |
| FROM_HERE, base::BindOnce(&RecordSqliteMemoryHour), | |
| base::TimeDelta::FromHours(1)); | |
| base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( | |
| FROM_HERE, base::BindOnce(&RecordSqliteMemoryDay), | |
| base::TimeDelta::FromDays(1)); | |
| base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( | |
| FROM_HERE, base::BindOnce(&RecordSqliteMemoryWeek), | |
| base::TimeDelta::FromDays(7)); | |
| } | |
| #endif // !defined(OS_IOS) | |
| first_call = false; | |
| } | |
| } | |
| } // namespace sql |