blob: 4fa0bc07342ae22f2d008c5070f1127c0f07091f [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"
Justin Cohen19ba5432018-07-10 16:47:3012#include "build/build_config.h"
Victor Costan3653df62018-02-08 21:38:1613#include "third_party/sqlite/sqlite3.h"
14
15namespace sql {
16
17namespace {
18
Justin Cohen19ba5432018-07-10 16:47:3019#if !defined(OS_IOS)
Victor Costan3653df62018-02-08 21:38:1620void RecordSqliteMemory10Min() {
Will Harrisb8693592018-08-28 22:58:4421 const int32_t used =
22 base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024);
Steven Holte95922222018-09-14 20:06:2323 UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.TenMinutes", used);
Victor Costan3653df62018-02-08 21:38:1624}
25
26void RecordSqliteMemoryHour() {
Will Harrisb8693592018-08-28 22:58:4427 const int32_t used =
28 base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024);
Steven Holte95922222018-09-14 20:06:2329 UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.OneHour", used);
Victor Costan3653df62018-02-08 21:38:1630}
31
32void RecordSqliteMemoryDay() {
Will Harrisb8693592018-08-28 22:58:4433 const int32_t used =
34 base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024);
Steven Holte95922222018-09-14 20:06:2335 UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.OneDay", used);
Victor Costan3653df62018-02-08 21:38:1636}
37
38void RecordSqliteMemoryWeek() {
Will Harrisb8693592018-08-28 22:58:4439 const int32_t used =
40 base::saturated_cast<int32_t>(sqlite3_memory_used() / 1024);
Steven Holte95922222018-09-14 20:06:2341 UMA_HISTOGRAM_COUNTS_1M("Sqlite.MemoryKB.OneWeek", used);
Victor Costan3653df62018-02-08 21:38:1642}
Justin Cohen19ba5432018-07-10 16:47:3043#endif // !defined(OS_IOS)
Victor Costan3653df62018-02-08 21:38:1644
45} // anonymous namespace
46
47void EnsureSqliteInitialized() {
48 // sqlite3_initialize() uses double-checked locking and thus can have
49 // data races.
50 static base::NoDestructor<base::Lock> sqlite_init_lock;
51 base::AutoLock auto_lock(*sqlite_init_lock);
52
53 static bool first_call = true;
54 if (first_call) {
55 sqlite3_initialize();
56
Justin Cohen19ba5432018-07-10 16:47:3057#if !defined(OS_IOS)
Victor Costan3653df62018-02-08 21:38:1658 // Schedule callback to record memory footprint histograms at 10m, 1h, and
59 // 1d. There may not be a registered task runner in tests.
Justin Cohen19ba5432018-07-10 16:47:3060 // TODO(crbug.com/861889): Disable very long critical tasks on iOS until
61 // 861889 is fixed.
Victor Costan3653df62018-02-08 21:38:1662 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));
75 }
Justin Cohen19ba5432018-07-10 16:47:3076#endif // !defined(OS_IOS)
Victor Costan3653df62018-02-08 21:38:1677 first_call = false;
78 }
79}
80
81} // namespace sql