Bug 1612799 - Make UniqueJSONStrings a FailureLatch - r=canaltinova

Differential Revision: https://phabricator.services.mozilla.com/D155652
This commit is contained in:
Gerald Squelart 2022-09-05 01:19:29 +00:00
parent 1339f652fd
commit 7dc3f8d14e
6 changed files with 51 additions and 15 deletions

View file

@ -232,7 +232,8 @@ bool UniqueStacks::FrameKey::NormalFrameData::operator==(
} }
UniqueStacks::UniqueStacks() UniqueStacks::UniqueStacks()
: mUniqueStrings(MakeUnique<UniqueJSONStrings>()), : mUniqueStrings(MakeUnique<UniqueJSONStrings>(
FailureLatchInfallibleSource::Singleton())),
mFrameTableWriter(FailureLatchInfallibleSource::Singleton()), mFrameTableWriter(FailureLatchInfallibleSource::Singleton()),
mStackTableWriter(FailureLatchInfallibleSource::Singleton()) { mStackTableWriter(FailureLatchInfallibleSource::Singleton()) {
mFrameTableWriter.StartBareList(); mFrameTableWriter.StartBareList();

View file

@ -8,16 +8,26 @@
namespace mozilla::baseprofiler { namespace mozilla::baseprofiler {
UniqueJSONStrings::UniqueJSONStrings() UniqueJSONStrings::UniqueJSONStrings(FailureLatch& aFailureLatch)
: mStringTableWriter(FailureLatchInfallibleSource::Singleton()) { : mStringTableWriter(aFailureLatch) {
mStringTableWriter.StartBareList(); mStringTableWriter.StartBareList();
} }
UniqueJSONStrings::UniqueJSONStrings(const UniqueJSONStrings& aOther, UniqueJSONStrings::UniqueJSONStrings(FailureLatch& aFailureLatch,
const UniqueJSONStrings& aOther,
ProgressLogger aProgressLogger) ProgressLogger aProgressLogger)
: mStringTableWriter(FailureLatchInfallibleSource::Singleton()) { : mStringTableWriter(aFailureLatch) {
using namespace mozilla::literals::ProportionValue_literals; // For `10_pc`. using namespace mozilla::literals::ProportionValue_literals; // For `10_pc`.
if (mStringTableWriter.Failed()) {
return;
}
if (const char* failure = aOther.GetFailure(); failure) {
mStringTableWriter.SetFailure(failure);
return;
}
mStringTableWriter.StartBareList(); mStringTableWriter.StartBareList();
uint32_t count = aOther.mStringHashToIndexMap.count(); uint32_t count = aOther.mStringHashToIndexMap.count();
if (count != 0) { if (count != 0) {

View file

@ -524,13 +524,14 @@ class JSONSchemaWriter {
// and later, `u.SpliceStringTableElements(w)` (inside a JSON array), will // and later, `u.SpliceStringTableElements(w)` (inside a JSON array), will
// output the corresponding indexed list of unique strings: // output the corresponding indexed list of unique strings:
// `["a", "b"]` // `["a", "b"]`
class UniqueJSONStrings { class UniqueJSONStrings final : public FailureLatch {
public: public:
// Start an empty list of unique strings. // Start an empty list of unique strings.
MFBT_API UniqueJSONStrings(); MFBT_API explicit UniqueJSONStrings(FailureLatch& aFailureLatch);
// Start with a copy of the strings from another list. // Start with a copy of the strings from another list.
MFBT_API UniqueJSONStrings(const UniqueJSONStrings& aOther, MFBT_API UniqueJSONStrings(FailureLatch& aFailureLatch,
const UniqueJSONStrings& aOther,
ProgressLogger aProgressLogger); ProgressLogger aProgressLogger);
MFBT_API ~UniqueJSONStrings(); MFBT_API ~UniqueJSONStrings();
@ -552,6 +553,12 @@ class UniqueJSONStrings {
// once, and then this UniqueStrings shouldn't be used anymore. // once, and then this UniqueStrings shouldn't be used anymore.
MFBT_API void SpliceStringTableElements(SpliceableJSONWriter& aWriter); MFBT_API void SpliceStringTableElements(SpliceableJSONWriter& aWriter);
FAILURELATCH_IMPL_PROXY(mStringTableWriter)
void ChangeFailureLatchAndForwardState(FailureLatch& aFailureLatch) {
mStringTableWriter.ChangeFailureLatchAndForwardState(aFailureLatch);
}
private: private:
// If `aStr` is already listed, return its index. // If `aStr` is already listed, return its index.
// Otherwise add it to the list and return the new index. // Otherwise add it to the list and return the new index.

View file

@ -5126,9 +5126,20 @@ static void VerifyUniqueStringContents(
&mozilla::FailureLatchInfallibleSource::Singleton()); &mozilla::FailureLatchInfallibleSource::Singleton());
// By default use a local UniqueJSONStrings, otherwise use the one provided. // By default use a local UniqueJSONStrings, otherwise use the one provided.
mozilla::baseprofiler::UniqueJSONStrings localUniqueStrings; mozilla::baseprofiler::UniqueJSONStrings localUniqueStrings{
FailureLatchInfallibleSource::Singleton()};
MOZ_RELEASE_ASSERT(!localUniqueStrings.Fallible());
MOZ_RELEASE_ASSERT(!localUniqueStrings.Failed());
MOZ_RELEASE_ASSERT(!localUniqueStrings.GetFailure());
MOZ_RELEASE_ASSERT(&localUniqueStrings.SourceFailureLatch() ==
&mozilla::FailureLatchInfallibleSource::Singleton());
MOZ_RELEASE_ASSERT(&std::as_const(localUniqueStrings).SourceFailureLatch() ==
&mozilla::FailureLatchInfallibleSource::Singleton());
mozilla::baseprofiler::UniqueJSONStrings& uniqueStrings = mozilla::baseprofiler::UniqueJSONStrings& uniqueStrings =
aUniqueStringsOrNull ? *aUniqueStringsOrNull : localUniqueStrings; aUniqueStringsOrNull ? *aUniqueStringsOrNull : localUniqueStrings;
MOZ_RELEASE_ASSERT(!uniqueStrings.Failed());
MOZ_RELEASE_ASSERT(!uniqueStrings.GetFailure());
writer.Start(); writer.Start();
{ {
@ -5142,6 +5153,9 @@ static void VerifyUniqueStringContents(
} }
writer.End(); writer.End();
MOZ_RELEASE_ASSERT(!uniqueStrings.Failed());
MOZ_RELEASE_ASSERT(!uniqueStrings.GetFailure());
MOZ_RELEASE_ASSERT(!writer.ChunkedWriteFunc().Failed()); MOZ_RELEASE_ASSERT(!writer.ChunkedWriteFunc().Failed());
MOZ_RELEASE_ASSERT(!writer.ChunkedWriteFunc().GetFailure()); MOZ_RELEASE_ASSERT(!writer.ChunkedWriteFunc().GetFailure());
@ -5243,7 +5257,7 @@ void TestUniqueJSONStrings() {
// Unique string table with pre-existing data. // Unique string table with pre-existing data.
{ {
UJS ujs; UJS ujs{FailureLatchInfallibleSource::Singleton()};
{ {
SCJW writer{FailureLatchInfallibleSource::Singleton()}; SCJW writer{FailureLatchInfallibleSource::Singleton()};
ujs.WriteElement(writer, "external0"); ujs.WriteElement(writer, "external0");
@ -5261,14 +5275,15 @@ void TestUniqueJSONStrings() {
// Unique string table with pre-existing data from another table. // Unique string table with pre-existing data from another table.
{ {
UJS ujs; UJS ujs{FailureLatchInfallibleSource::Singleton()};
{ {
SCJW writer{FailureLatchInfallibleSource::Singleton()}; SCJW writer{FailureLatchInfallibleSource::Singleton()};
ujs.WriteElement(writer, "external0"); ujs.WriteElement(writer, "external0");
ujs.WriteElement(writer, "external1"); ujs.WriteElement(writer, "external1");
ujs.WriteElement(writer, "external0"); ujs.WriteElement(writer, "external0");
} }
UJS ujsCopy(ujs, mozilla::ProgressLogger{}); UJS ujsCopy(FailureLatchInfallibleSource::Singleton(), ujs,
mozilla::ProgressLogger{});
VerifyUniqueStringContents( VerifyUniqueStringContents(
[](SCJW& aWriter, UJS& aUniqueStrings) { [](SCJW& aWriter, UJS& aUniqueStrings) {
aUniqueStrings.WriteElement(aWriter, "string0"); aUniqueStrings.WriteElement(aWriter, "string0");
@ -5329,7 +5344,8 @@ void PrintMarkers(const mozilla::ProfileChunkedBuffer& aBuffer) {
mozilla::MakeUnique<mozilla::baseprofiler::OStreamJSONWriteFunc>( mozilla::MakeUnique<mozilla::baseprofiler::OStreamJSONWriteFunc>(
std::cout), std::cout),
FailureLatchInfallibleSource::Singleton()); FailureLatchInfallibleSource::Singleton());
mozilla::baseprofiler::UniqueJSONStrings uniqueStrings; mozilla::baseprofiler::UniqueJSONStrings uniqueStrings{
FailureLatchInfallibleSource::Singleton()};
writer.SetUniqueStrings(uniqueStrings); writer.SetUniqueStrings(uniqueStrings);
writer.Start(); writer.Start();
{ {

View file

@ -268,7 +268,7 @@ JITFrameInfoForBufferRange JITFrameInfoForBufferRange::Clone() const {
JITFrameInfo::JITFrameInfo(const JITFrameInfo& aOther, JITFrameInfo::JITFrameInfo(const JITFrameInfo& aOther,
mozilla::ProgressLogger aProgressLogger) mozilla::ProgressLogger aProgressLogger)
: mUniqueStrings(MakeUnique<UniqueJSONStrings>( : mUniqueStrings(MakeUnique<UniqueJSONStrings>(
*aOther.mUniqueStrings, FailureLatchInfallibleSource::Singleton(), *aOther.mUniqueStrings,
aProgressLogger.CreateSubLoggerFromTo( aProgressLogger.CreateSubLoggerFromTo(
0_pc, "Creating JIT frame info unique strings...", 49_pc, 0_pc, "Creating JIT frame info unique strings...", 49_pc,
"Created JIT frame info unique strings"))) { "Created JIT frame info unique strings"))) {

View file

@ -143,7 +143,9 @@ struct JITFrameInfoForBufferRange final {
// ranges. // ranges.
class JITFrameInfo final { class JITFrameInfo final {
public: public:
JITFrameInfo() : mUniqueStrings(mozilla::MakeUnique<UniqueJSONStrings>()) {} JITFrameInfo()
: mUniqueStrings(mozilla::MakeUnique<UniqueJSONStrings>(
mozilla::FailureLatchInfallibleSource::Singleton())) {}
MOZ_IMPLICIT JITFrameInfo(const JITFrameInfo& aOther, MOZ_IMPLICIT JITFrameInfo(const JITFrameInfo& aOther,
mozilla::ProgressLogger aProgressLogger); mozilla::ProgressLogger aProgressLogger);