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() {