blob: 58a1ed7a3da8df94a4c2d2d4e4d4a998a52e5c9d [file] [log] [blame]
Victor Costan3653df62018-02-08 21:38:161// 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.
4
5#include "sql/initialization.h"
6
7#include "base/bind.h"
8#include "base/metrics/histogram_macros.h"
9#include "base/no_destructor.h"
Will Harrisb8693592018-08-28 22:58:4410#include "base/numerics/safe_conversions.h"
Victor Costan3653df62018-02-08 21:38:1611#include "base/threading/sequenced_task_runner_handle.h"
Etienne Bergerond4888db2021-04-30 01:18:4912#include "base/trace_event/trace_event.h"
Justin Cohen19ba5432018-07-10 16:47:3013#include "build/build_config.h"
Victor Costan3653df62018-02-08 21:38:1614#include "third_party/sqlite/sqlite3.h"
15
16namespace sql {
17
18namespace {
19
Justin Cohen19ba5432018-07-10 16:47:3020#if !defined(OS_IOS)
Victor Costan3653df62018-02-08 21:38:1621void RecordSqliteMemory10Min() {
Will Harrisb8693592018-08-28 22:58:4422 const int32_t used =
23 base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024);
Steven Holte95922222018-09-14 20:06:2324 UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.TenMinutes", used);
Victor Costan3653df62018-02-08 21:38:1625}
26
27void RecordSqliteMemoryHour() {
Will Harrisb8693592018-08-28 22:58:4428 const int32_t used =
29 base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024);
Steven Holte95922222018-09-14 20:06:2330 UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.OneHour", used);
Victor Costan3653df62018-02-08 21:38:1631}
32
33void RecordSqliteMemoryDay() {
Will Harrisb8693592018-08-28 22:58:4434 const int32_t used =
35 base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024);
Steven Holte95922222018-09-14 20:06:2336 UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.OneDay", used);
Victor Costan3653df62018-02-08 21:38:1637}
38
39void RecordSqliteMemoryWeek() {
Will Harrisb8693592018-08-28 22:58:4440 const int32_t used =
41 base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024);
Steven Holte95922222018-09-14 20:06:2342 UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.OneWeek", used);
Victor Costan3653df62018-02-08 21:38:1643}
Justin Cohen19ba5432018-07-10 16:47:3044#endif // !defined(OS_IOS)
Victor Costan3653df62018-02-08 21:38:1645
46} // anonymous namespace
47
48void EnsureSqliteInitialized() {
49 // sqlite3_initialize() uses double-checked locking and thus can have
50 // data races.
51 static base::NoDestructor<base::Lock> sqlite_init_lock;
52 base::AutoLock auto_lock(*sqlite_init_lock);
53
54 static bool first_call = true;
55 if (first_call) {
Etienne Bergerond4888db2021-04-30 01:18:4956 TRACE_EVENT0("sql", "EnsureSqliteInitialized");
Victor Costan3653df62018-02-08 21:38:1657 sqlite3_initialize();
58
Justin Cohen19ba5432018-07-10 16:47:3059#if !defined(OS_IOS)
Victor Costan3653df62018-02-08 21:38:1660 // Schedule callback to record memory footprint histograms at 10m, 1h, and
61 // 1d. There may not be a registered task runner in tests.
Justin Cohen19ba5432018-07-10 16:47:3062 // TODO(crbug.com/861889): Disable very long critical tasks on iOS until
63 // 861889 is fixed.
Victor Costan3653df62018-02-08 21:38:1664 if (base::SequencedTaskRunnerHandle::IsSet()) {
65 base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
66 FROM_HERE, base::BindOnce(&RecordSqliteMemory10Min),
67 base::TimeDelta::FromMinutes(10));
68 base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
69 FROM_HERE, base::BindOnce(&RecordSqliteMemoryHour),
70 base::TimeDelta::FromHours(1));
71 base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
72 FROM_HERE, base::BindOnce(&RecordSqliteMemoryDay),
73 base::TimeDelta::FromDays(1));
74 base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
75 FROM_HERE, base::BindOnce(&RecordSqliteMemoryWeek),
76 base::TimeDelta::FromDays(7));
77 }
Justin Cohen19ba5432018-07-10 16:47:3078#endif // !defined(OS_IOS)
Victor Costan3653df62018-02-08 21:38:1679 first_call = false;
80 }
81}
82
83} // namespace sql