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()
|
||||
: mUniqueStrings(MakeUnique<UniqueJSONStrings>()),
|
||||
: mUniqueStrings(MakeUnique<UniqueJSONStrings>(
|
||||
FailureLatchInfallibleSource::Singleton())),
|
||||
mFrameTableWriter(FailureLatchInfallibleSource::Singleton()),
|
||||
mStackTableWriter(FailureLatchInfallibleSource::Singleton()) {
|
||||
mFrameTableWriter.StartBareList();
|
||||
|
|
|
|||
|
|
@ -8,16 +8,26 @@
|
|||
|
||||
namespace mozilla::baseprofiler {
|
||||
|
||||
UniqueJSONStrings::UniqueJSONStrings()
|
||||
: mStringTableWriter(FailureLatchInfallibleSource::Singleton()) {
|
||||
UniqueJSONStrings::UniqueJSONStrings(FailureLatch& aFailureLatch)
|
||||
: mStringTableWriter(aFailureLatch) {
|
||||
mStringTableWriter.StartBareList();
|
||||
}
|
||||
|
||||
UniqueJSONStrings::UniqueJSONStrings(const UniqueJSONStrings& aOther,
|
||||
UniqueJSONStrings::UniqueJSONStrings(FailureLatch& aFailureLatch,
|
||||
const UniqueJSONStrings& aOther,
|
||||
ProgressLogger aProgressLogger)
|
||||
: mStringTableWriter(FailureLatchInfallibleSource::Singleton()) {
|
||||
: mStringTableWriter(aFailureLatch) {
|
||||
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();
|
||||
uint32_t count = aOther.mStringHashToIndexMap.count();
|
||||
if (count != 0) {
|
||||
|
|
|
|||
|
|
@ -524,13 +524,14 @@ class JSONSchemaWriter {
|
|||
// and later, `u.SpliceStringTableElements(w)` (inside a JSON array), will
|
||||
// output the corresponding indexed list of unique strings:
|
||||
// `["a", "b"]`
|
||||
class UniqueJSONStrings {
|
||||
class UniqueJSONStrings final : public FailureLatch {
|
||||
public:
|
||||
// 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.
|
||||
MFBT_API UniqueJSONStrings(const UniqueJSONStrings& aOther,
|
||||
MFBT_API UniqueJSONStrings(FailureLatch& aFailureLatch,
|
||||
const UniqueJSONStrings& aOther,
|
||||
ProgressLogger aProgressLogger);
|
||||
|
||||
MFBT_API ~UniqueJSONStrings();
|
||||
|
|
@ -552,6 +553,12 @@ class UniqueJSONStrings {
|
|||
// once, and then this UniqueStrings shouldn't be used anymore.
|
||||
MFBT_API void SpliceStringTableElements(SpliceableJSONWriter& aWriter);
|
||||
|
||||
FAILURELATCH_IMPL_PROXY(mStringTableWriter)
|
||||
|
||||
void ChangeFailureLatchAndForwardState(FailureLatch& aFailureLatch) {
|
||||
mStringTableWriter.ChangeFailureLatchAndForwardState(aFailureLatch);
|
||||
}
|
||||
|
||||
private:
|
||||
// If `aStr` is already listed, return its index.
|
||||
// Otherwise add it to the list and return the new index.
|
||||
|
|
|
|||
|
|
@ -5126,9 +5126,20 @@ static void VerifyUniqueStringContents(
|
|||
&mozilla::FailureLatchInfallibleSource::Singleton());
|
||||
|
||||
// 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 =
|
||||
aUniqueStringsOrNull ? *aUniqueStringsOrNull : localUniqueStrings;
|
||||
MOZ_RELEASE_ASSERT(!uniqueStrings.Failed());
|
||||
MOZ_RELEASE_ASSERT(!uniqueStrings.GetFailure());
|
||||
|
||||
writer.Start();
|
||||
{
|
||||
|
|
@ -5142,6 +5153,9 @@ static void VerifyUniqueStringContents(
|
|||
}
|
||||
writer.End();
|
||||
|
||||
MOZ_RELEASE_ASSERT(!uniqueStrings.Failed());
|
||||
MOZ_RELEASE_ASSERT(!uniqueStrings.GetFailure());
|
||||
|
||||
MOZ_RELEASE_ASSERT(!writer.ChunkedWriteFunc().Failed());
|
||||
MOZ_RELEASE_ASSERT(!writer.ChunkedWriteFunc().GetFailure());
|
||||
|
||||
|
|
@ -5243,7 +5257,7 @@ void TestUniqueJSONStrings() {
|
|||
|
||||
// Unique string table with pre-existing data.
|
||||
{
|
||||
UJS ujs;
|
||||
UJS ujs{FailureLatchInfallibleSource::Singleton()};
|
||||
{
|
||||
SCJW writer{FailureLatchInfallibleSource::Singleton()};
|
||||
ujs.WriteElement(writer, "external0");
|
||||
|
|
@ -5261,14 +5275,15 @@ void TestUniqueJSONStrings() {
|
|||
|
||||
// Unique string table with pre-existing data from another table.
|
||||
{
|
||||
UJS ujs;
|
||||
UJS ujs{FailureLatchInfallibleSource::Singleton()};
|
||||
{
|
||||
SCJW writer{FailureLatchInfallibleSource::Singleton()};
|
||||
ujs.WriteElement(writer, "external0");
|
||||
ujs.WriteElement(writer, "external1");
|
||||
ujs.WriteElement(writer, "external0");
|
||||
}
|
||||
UJS ujsCopy(ujs, mozilla::ProgressLogger{});
|
||||
UJS ujsCopy(FailureLatchInfallibleSource::Singleton(), ujs,
|
||||
mozilla::ProgressLogger{});
|
||||
VerifyUniqueStringContents(
|
||||
[](SCJW& aWriter, UJS& aUniqueStrings) {
|
||||
aUniqueStrings.WriteElement(aWriter, "string0");
|
||||
|
|
@ -5329,7 +5344,8 @@ void PrintMarkers(const mozilla::ProfileChunkedBuffer& aBuffer) {
|
|||
mozilla::MakeUnique<mozilla::baseprofiler::OStreamJSONWriteFunc>(
|
||||
std::cout),
|
||||
FailureLatchInfallibleSource::Singleton());
|
||||
mozilla::baseprofiler::UniqueJSONStrings uniqueStrings;
|
||||
mozilla::baseprofiler::UniqueJSONStrings uniqueStrings{
|
||||
FailureLatchInfallibleSource::Singleton()};
|
||||
writer.SetUniqueStrings(uniqueStrings);
|
||||
writer.Start();
|
||||
{
|
||||
|
|
|
|||
|
|
@ -268,7 +268,7 @@ JITFrameInfoForBufferRange JITFrameInfoForBufferRange::Clone() const {
|
|||
JITFrameInfo::JITFrameInfo(const JITFrameInfo& aOther,
|
||||
mozilla::ProgressLogger aProgressLogger)
|
||||
: mUniqueStrings(MakeUnique<UniqueJSONStrings>(
|
||||
*aOther.mUniqueStrings,
|
||||
FailureLatchInfallibleSource::Singleton(), *aOther.mUniqueStrings,
|
||||
aProgressLogger.CreateSubLoggerFromTo(
|
||||
0_pc, "Creating JIT frame info unique strings...", 49_pc,
|
||||
"Created JIT frame info unique strings"))) {
|
||||
|
|
|
|||
|
|
@ -143,7 +143,9 @@ struct JITFrameInfoForBufferRange final {
|
|||
// ranges.
|
||||
class JITFrameInfo final {
|
||||
public:
|
||||
JITFrameInfo() : mUniqueStrings(mozilla::MakeUnique<UniqueJSONStrings>()) {}
|
||||
JITFrameInfo()
|
||||
: mUniqueStrings(mozilla::MakeUnique<UniqueJSONStrings>(
|
||||
mozilla::FailureLatchInfallibleSource::Singleton())) {}
|
||||
|
||||
MOZ_IMPLICIT JITFrameInfo(const JITFrameInfo& aOther,
|
||||
mozilla::ProgressLogger aProgressLogger);
|
||||
|
|
|
|||
Loading…
Reference in a new issue