[sql] Record memory usage at various periods after startup.

This will be used to track improvements occuring from enabling
memory-mapped I/O.

BUG=489784

Review URL: https://codereview.chromium.org/1283033004

Cr-Commit-Position: refs/heads/master@{#343100}
diff --git a/sql/connection.cc b/sql/connection.cc
index 0cb3b131..2fcc9da 100644
--- a/sql/connection.cc
+++ b/sql/connection.cc
@@ -6,10 +6,12 @@
 
 #include <string.h>
 
+#include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/lazy_instance.h"
 #include "base/logging.h"
+#include "base/message_loop/message_loop.h"
 #include "base/metrics/histogram.h"
 #include "base/metrics/sparse_histogram.h"
 #include "base/strings/string_split.h"
@@ -111,6 +113,21 @@
   return true;
 }
 
+void RecordSqliteMemory10Min() {
+  const int64 used = sqlite3_memory_used();
+  UMA_HISTOGRAM_COUNTS("Sqlite.MemoryKB.TenMinutes", used / 1024);
+}
+
+void RecordSqliteMemoryHour() {
+  const int64 used = sqlite3_memory_used();
+  UMA_HISTOGRAM_COUNTS("Sqlite.MemoryKB.OneHour", used / 1024);
+}
+
+void RecordSqliteMemoryDay() {
+  const int64 used = sqlite3_memory_used();
+  UMA_HISTOGRAM_COUNTS("Sqlite.MemoryKB.OneDay", used / 1024);
+}
+
 // SQLite automatically calls sqlite3_initialize() lazily, but
 // sqlite3_initialize() uses double-checked locking and thus can have
 // data races.
@@ -122,7 +139,26 @@
     g_sqlite_init_lock = LAZY_INSTANCE_INITIALIZER;
 void InitializeSqlite() {
   base::AutoLock lock(g_sqlite_init_lock.Get());
-  sqlite3_initialize();
+  static bool first_call = true;
+  if (first_call) {
+    sqlite3_initialize();
+
+    // Schedule callback to record memory footprint histograms at 10m, 1h, and
+    // 1d.  There may not be a message loop in tests.
+    if (base::MessageLoop::current()) {
+      base::MessageLoop::current()->PostDelayedTask(
+          FROM_HERE, base::Bind(&RecordSqliteMemory10Min),
+          base::TimeDelta::FromMinutes(10));
+      base::MessageLoop::current()->PostDelayedTask(
+          FROM_HERE, base::Bind(&RecordSqliteMemoryHour),
+          base::TimeDelta::FromHours(1));
+      base::MessageLoop::current()->PostDelayedTask(
+          FROM_HERE, base::Bind(&RecordSqliteMemoryDay),
+          base::TimeDelta::FromDays(1));
+    }
+
+    first_call = false;
+  }
 }
 
 // Helper to get the sqlite3_file* associated with the "main" database.