1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "sql/initialization.h"
8 #include "base/metrics/histogram_macros.h"
9 #include "base/no_destructor.h"
10 #include "base/numerics/safe_conversions.h"
11 #include "base/threading/sequenced_task_runner_handle.h"
12 #include "build/build_config.h"
13 #include "third_party/sqlite/sqlite3.h"
20 void RecordSqliteMemory10Min() {
22 base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024);
23 UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.TenMinutes", used);
26 void RecordSqliteMemoryHour() {
28 base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024);
29 UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.OneHour", used);
32 void RecordSqliteMemoryDay() {
34 base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024);
35 UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.OneDay", used);
38 void RecordSqliteMemoryWeek() {
40 base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024);
41 UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.OneWeek", used);
43 #endif // !defined(OS_IOS)
45 } // anonymous namespace
47 void EnsureSqliteInitialized() {
48 // sqlite3_initialize() uses double-checked locking and thus can have
50 static base::NoDestructor<base::Lock> sqlite_init_lock;
51 base::AutoLock auto_lock(*sqlite_init_lock);
53 static bool first_call = true;
58 // Schedule callback to record memory footprint histograms at 10m, 1h, and
59 // 1d. There may not be a registered task runner in tests.
60 // TODO(crbug.com/861889): Disable very long critical tasks on iOS until
62 if (base::SequencedTaskRunnerHandle::IsSet()) {
63 base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
64 FROM_HERE, base::BindOnce(&RecordSqliteMemory10Min),
65 base::TimeDelta::FromMinutes(10));
66 base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
67 FROM_HERE, base::BindOnce(&RecordSqliteMemoryHour),
68 base::TimeDelta::FromHours(1));
69 base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
70 FROM_HERE, base::BindOnce(&RecordSqliteMemoryDay),
71 base::TimeDelta::FromDays(1));
72 base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
73 FROM_HERE, base::BindOnce(&RecordSqliteMemoryWeek),
74 base::TimeDelta::FromDays(7));
76 #endif // !defined(OS_IOS)