forked from mirrors/gecko-dev
Bug 1612799 - Make UniqueJSONStrings a FailureLatch - r=canaltinova
Differential Revision: https://phabricator.services.mozilla.com/D155652
This commit is contained in:
parent
1339f652fd
commit
7dc3f8d14e
6 changed files with 51 additions and 15 deletions
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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"))) {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue