summaryrefslogtreecommitdiffstats
path: root/dom/quota/ScopedLogExtraInfo.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /dom/quota/ScopedLogExtraInfo.cpp
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/quota/ScopedLogExtraInfo.cpp')
-rw-r--r--dom/quota/ScopedLogExtraInfo.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/dom/quota/ScopedLogExtraInfo.cpp b/dom/quota/ScopedLogExtraInfo.cpp
new file mode 100644
index 0000000000..c3ad5e04e1
--- /dev/null
+++ b/dom/quota/ScopedLogExtraInfo.cpp
@@ -0,0 +1,80 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ScopedLogExtraInfo.h"
+
+namespace mozilla::dom::quota {
+
+#ifdef QM_SCOPED_LOG_EXTRA_INFO_ENABLED
+MOZ_THREAD_LOCAL(const nsACString*) ScopedLogExtraInfo::sQueryValue;
+MOZ_THREAD_LOCAL(const nsACString*) ScopedLogExtraInfo::sContextValue;
+
+/* static */
+auto ScopedLogExtraInfo::FindSlot(const char* aTag) {
+ // XXX For now, don't use a real map but just allow the known tag values.
+
+ if (aTag == kTagQuery) {
+ return &sQueryValue;
+ }
+
+ if (aTag == kTagContext) {
+ return &sContextValue;
+ }
+
+ MOZ_CRASH("Unknown tag!");
+}
+
+ScopedLogExtraInfo::~ScopedLogExtraInfo() {
+ if (mTag) {
+ MOZ_ASSERT(&mCurrentValue == FindSlot(mTag)->get(),
+ "Bad scoping of ScopedLogExtraInfo, must not be interleaved!");
+
+ FindSlot(mTag)->set(mPreviousValue);
+ }
+}
+
+ScopedLogExtraInfo::ScopedLogExtraInfo(ScopedLogExtraInfo&& aOther)
+ : mTag(aOther.mTag),
+ mPreviousValue(aOther.mPreviousValue),
+ mCurrentValue(std::move(aOther.mCurrentValue)) {
+ aOther.mTag = nullptr;
+ FindSlot(mTag)->set(&mCurrentValue);
+}
+
+/* static */ ScopedLogExtraInfo::ScopedLogExtraInfoMap
+ScopedLogExtraInfo::GetExtraInfoMap() {
+ // This could be done in a cheaper way, but this is never called on a hot
+ // path, so we anticipate using a real map inside here to make use simpler for
+ // the caller(s).
+
+ ScopedLogExtraInfoMap map;
+ if (XRE_IsParentProcess()) {
+ if (sQueryValue.get()) {
+ map.emplace(kTagQuery, sQueryValue.get());
+ }
+
+ if (sContextValue.get()) {
+ map.emplace(kTagContext, sContextValue.get());
+ }
+ }
+ return map;
+}
+
+/* static */ void ScopedLogExtraInfo::Initialize() {
+ MOZ_ALWAYS_TRUE(sQueryValue.init());
+ MOZ_ALWAYS_TRUE(sContextValue.init());
+}
+
+void ScopedLogExtraInfo::AddInfo() {
+ auto* slot = FindSlot(mTag);
+ MOZ_ASSERT(slot);
+ mPreviousValue = slot->get();
+
+ slot->set(&mCurrentValue);
+}
+#endif
+
+} // namespace mozilla::dom::quota