Use call_once in lazy settings load.

This fixes a test case that accesses settings for the first time in
multiple threads simultaneously.

Fixed: crashpad:417
Change-Id: I6539682f171563f8ff5a1203fdd550ab92afc276
Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/3711807
Commit-Queue: Justin Cohen <justincohen@chromium.org>
Reviewed-by: Robert Sesek <rsesek@chromium.org>
diff --git a/client/crash_report_database_generic.cc b/client/crash_report_database_generic.cc
index c4e0401..742850a 100644
--- a/client/crash_report_database_generic.cc
+++ b/client/crash_report_database_generic.cc
@@ -18,6 +18,7 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 
+#include <mutex>
 #include <tuple>
 #include <utility>
 
@@ -258,15 +259,15 @@
   static bool WriteMetadata(const base::FilePath& path, const Report& report);
 
   Settings& SettingsInternal() {
-    if (!settings_init_)
+    std::call_once(settings_init_, [this]() {
       settings_.Initialize(base_dir_.Append(kSettings));
-    settings_init_ = true;
+    });
     return settings_;
   }
 
   base::FilePath base_dir_;
   Settings settings_;
-  bool settings_init_ = false;
+  std::once_flag settings_init_;
   InitializationStateDcheck initialized_;
 };
 
diff --git a/client/crash_report_database_mac.mm b/client/crash_report_database_mac.mm
index 4c9e5e7..e33b932 100644
--- a/client/crash_report_database_mac.mm
+++ b/client/crash_report_database_mac.mm
@@ -27,6 +27,7 @@
 
 #include <array>
 #include <iterator>
+#include <mutex>
 #include <tuple>
 
 #include "base/logging.h"
@@ -263,15 +264,15 @@
   void CleanOrphanedAttachments();
 
   Settings& SettingsInternal() {
-    if (!settings_init_)
+    std::call_once(settings_init_, [this]() {
       settings_.Initialize(base_dir_.Append(kSettings));
-    settings_init_ = true;
+    });
     return settings_;
   }
 
   base::FilePath base_dir_;
   Settings settings_;
-  bool settings_init_;
+  std::once_flag settings_init_;
   bool xattr_new_names_;
   InitializationStateDcheck initialized_;
 };
@@ -280,7 +281,7 @@
     : CrashReportDatabase(),
       base_dir_(path),
       settings_(),
-      settings_init_(false),
+      settings_init_(),
       xattr_new_names_(false),
       initialized_() {}
 
diff --git a/client/crash_report_database_win.cc b/client/crash_report_database_win.cc
index e16aa10..e111d8e 100644
--- a/client/crash_report_database_win.cc
+++ b/client/crash_report_database_win.cc
@@ -21,6 +21,7 @@
 #include <time.h>
 #include <wchar.h>
 
+#include <mutex>
 #include <tuple>
 #include <utility>
 
@@ -663,15 +664,15 @@
   std::unique_ptr<Metadata> AcquireMetadata();
 
   Settings& SettingsInternal() {
-    if (!settings_init_)
+    std::call_once(settings_init_, [this]() {
       settings_.Initialize(base_dir_.Append(kSettings));
-    settings_init_ = true;
+    });
     return settings_;
   }
 
   base::FilePath base_dir_;
   Settings settings_;
-  bool settings_init_;
+  std::once_flag settings_init_;
   InitializationStateDcheck initialized_;
 };
 
@@ -679,7 +680,7 @@
     : CrashReportDatabase(),
       base_dir_(path),
       settings_(),
-      settings_init_(false),
+      settings_init_(),
       initialized_() {}
 
 CrashReportDatabaseWin::~CrashReportDatabaseWin() {