blob: 85b8d1ee0b988a7000d024432bb20b2a6c99a15b [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"
10#include "base/threading/sequenced_task_runner_handle.h"
Justin Cohen19ba5432018-07-10 16:47:3011#include "build/build_config.h"
Victor Costan3653df62018-02-08 21:38:1612#include "third_party/sqlite/sqlite3.h"
13
14namespace sql {
15
16namespace {
17
Justin Cohen19ba5432018-07-10 16:47:3018#if !defined(OS_IOS)
Victor Costan3653df62018-02-08 21:38:1619void RecordSqliteMemory10Min() {
20 const int64_t used = sqlite3_memory_used();
21 UMA_HISTOGRAM_COUNTS("Sqlite.MemoryKB.TenMinutes", used / 1024);
22}
23
24void RecordSqliteMemoryHour() {
25 const int64_t used = sqlite3_memory_used();
26 UMA_HISTOGRAM_COUNTS("Sqlite.MemoryKB.OneHour", used / 1024);
27}
28
29void RecordSqliteMemoryDay() {
30 const int64_t used = sqlite3_memory_used();
31 UMA_HISTOGRAM_COUNTS("Sqlite.MemoryKB.OneDay", used / 1024);
32}
33
34void RecordSqliteMemoryWeek() {
35 const int64_t used = sqlite3_memory_used();
36 UMA_HISTOGRAM_COUNTS("Sqlite.MemoryKB.OneWeek", used / 1024);
37}
Justin Cohen19ba5432018-07-10 16:47:3038#endif // !defined(OS_IOS)
Victor Costan3653df62018-02-08 21:38:1639
40} // anonymous namespace
41
42void EnsureSqliteInitialized() {
43 // sqlite3_initialize() uses double-checked locking and thus can have
44 // data races.
45 static base::NoDestructor<base::Lock> sqlite_init_lock;
46 base::AutoLock auto_lock(*sqlite_init_lock);
47
48 static bool first_call = true;
49 if (first_call) {
50 sqlite3_initialize();
51
Justin Cohen19ba5432018-07-10 16:47:3052#if !defined(OS_IOS)
Victor Costan3653df62018-02-08 21:38:1653 // Schedule callback to record memory footprint histograms at 10m, 1h, and
54 // 1d. There may not be a registered task runner in tests.
Justin Cohen19ba5432018-07-10 16:47:3055 // TODO(crbug.com/861889): Disable very long critical tasks on iOS until
56 // 861889 is fixed.
Victor Costan3653df62018-02-08 21:38:1657 if (base::SequencedTaskRunnerHandle::IsSet()) {
58 base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
59 FROM_HERE, base::BindOnce(&RecordSqliteMemory10Min),
60 base::TimeDelta::FromMinutes(10));
61 base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
62 FROM_HERE, base::BindOnce(&RecordSqliteMemoryHour),
63 base::TimeDelta::FromHours(1));
64 base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
65 FROM_HERE, base::BindOnce(&RecordSqliteMemoryDay),
66 base::TimeDelta::FromDays(1));
67 base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
68 FROM_HERE, base::BindOnce(&RecordSqliteMemoryWeek),
69 base::TimeDelta::FromDays(7));
70 }
Justin Cohen19ba5432018-07-10 16:47:3071#endif // !defined(OS_IOS)
Victor Costan3653df62018-02-08 21:38:1672 first_call = false;
73 }
74}
75
76} // namespace sql