Bug 1612799 - Make UniqueStacks a FailureLatch - r=canaltinova

Differential Revision: https://phabricator.services.mozilla.com/D155656
This commit is contained in:
Gerald Squelart 2022-09-05 01:19:30 +00:00
Родитель 001b0d4ec0
Коммит 474f0cf9c9
3 изменённых файлов: 37 добавлений и 16 удалений

Просмотреть файл

@ -233,6 +233,23 @@ UniqueStacks::StackKey UniqueStacks::BeginStack(const FrameKey& aFrame) {
return StackKey(GetOrAddFrameIndex(aFrame)); return StackKey(GetOrAddFrameIndex(aFrame));
} }
Vector<JITFrameInfoForBufferRange>&&
JITFrameInfo::MoveRangesWithNewFailureLatch(FailureLatch& aFailureLatch) && {
aFailureLatch.SetFailureFrom(mLocalFailureLatchSource);
return std::move(mRanges);
}
UniquePtr<UniqueJSONStrings>&&
JITFrameInfo::MoveUniqueStringsWithNewFailureLatch(
FailureLatch& aFailureLatch) && {
if (mUniqueStrings) {
mUniqueStrings->ChangeFailureLatchAndForwardState(aFailureLatch);
} else {
aFailureLatch.SetFailureFrom(mLocalFailureLatchSource);
}
return std::move(mUniqueStrings);
}
UniqueStacks::StackKey UniqueStacks::AppendFrame(const StackKey& aStack, UniqueStacks::StackKey UniqueStacks::AppendFrame(const StackKey& aStack,
const FrameKey& aFrame) { const FrameKey& aFrame) {
return StackKey(aStack, GetOrAddStackIndex(aStack), return StackKey(aStack, GetOrAddStackIndex(aStack),
@ -299,13 +316,15 @@ bool UniqueStacks::FrameKey::JITFrameData::operator==(
// JIT frame info's string table, so our string table needs to have the same // JIT frame info's string table, so our string table needs to have the same
// strings at the same indices. // strings at the same indices.
UniqueStacks::UniqueStacks( UniqueStacks::UniqueStacks(
JITFrameInfo&& aJITFrameInfo, FailureLatch& aFailureLatch, JITFrameInfo&& aJITFrameInfo,
ProfilerCodeAddressService* aCodeAddressService /* = nullptr */) ProfilerCodeAddressService* aCodeAddressService /* = nullptr */)
: mUniqueStrings(std::move(aJITFrameInfo).MoveUniqueStrings()), : mUniqueStrings(std::move(aJITFrameInfo)
.MoveUniqueStringsWithNewFailureLatch(aFailureLatch)),
mCodeAddressService(aCodeAddressService), mCodeAddressService(aCodeAddressService),
mFrameTableWriter(FailureLatchInfallibleSource::Singleton()), mFrameTableWriter(aFailureLatch),
mStackTableWriter(FailureLatchInfallibleSource::Singleton()), mStackTableWriter(aFailureLatch),
mJITInfoRanges(std::move(aJITFrameInfo).MoveRanges()) { mJITInfoRanges(std::move(aJITFrameInfo)
.MoveRangesWithNewFailureLatch(aFailureLatch)) {
mFrameTableWriter.StartBareList(); mFrameTableWriter.StartBareList();
mStackTableWriter.StartBareList(); mStackTableWriter.StartBareList();
} }

Просмотреть файл

@ -178,12 +178,12 @@ class JITFrameInfo final {
return mLocalFailureLatchSource; return mLocalFailureLatchSource;
} }
mozilla::Vector<JITFrameInfoForBufferRange>&& MoveRanges() && { // The encapsulated data points at the local FailureLatch, so on the way out
return std::move(mRanges); // they must be given a new external FailureLatch to start using instead.
} mozilla::Vector<JITFrameInfoForBufferRange>&& MoveRangesWithNewFailureLatch(
mozilla::UniquePtr<UniqueJSONStrings>&& MoveUniqueStrings() && { mozilla::FailureLatch& aFailureLatch) &&;
return std::move(mUniqueStrings); mozilla::UniquePtr<UniqueJSONStrings>&& MoveUniqueStringsWithNewFailureLatch(
} mozilla::FailureLatch& aFailureLatch) &&;
private: private:
// JITFrameInfo's may exist during profiling, so it carries its own fallible // JITFrameInfo's may exist during profiling, so it carries its own fallible
@ -202,7 +202,7 @@ class JITFrameInfo final {
mozilla::UniquePtr<UniqueJSONStrings> mUniqueStrings; mozilla::UniquePtr<UniqueJSONStrings> mUniqueStrings;
}; };
class UniqueStacks { class UniqueStacks final : public mozilla::FailureLatch {
public: public:
struct FrameKey { struct FrameKey {
explicit FrameKey(const char* aLocation) explicit FrameKey(const char* aLocation)
@ -332,9 +332,9 @@ class UniqueStacks {
} }
}; };
explicit UniqueStacks( UniqueStacks(mozilla::FailureLatch& aFailureLatch,
JITFrameInfo&& aJITFrameInfo, JITFrameInfo&& aJITFrameInfo,
ProfilerCodeAddressService* aCodeAddressService = nullptr); ProfilerCodeAddressService* aCodeAddressService = nullptr);
// Return a StackKey for aFrame as the stack's root frame (no prefix). // Return a StackKey for aFrame as the stack's root frame (no prefix).
[[nodiscard]] StackKey BeginStack(const FrameKey& aFrame); [[nodiscard]] StackKey BeginStack(const FrameKey& aFrame);
@ -367,6 +367,8 @@ class UniqueStacks {
// provided), otherwise just stringify that PC. // provided), otherwise just stringify that PC.
[[nodiscard]] nsAutoCString FunctionNameOrAddress(void* aPC); [[nodiscard]] nsAutoCString FunctionNameOrAddress(void* aPC);
FAILURELATCH_IMPL_PROXY(mFrameTableWriter)
private: private:
void StreamNonJITFrame(const FrameKey& aFrame); void StreamNonJITFrame(const FrameKey& aFrame);
void StreamStack(const StackKey& aStack); void StreamStack(const StackKey& aStack);

Просмотреть файл

@ -125,7 +125,7 @@ ProfiledThreadData::PrepareUniqueStacks(
} }
return mozilla::MakeNotNull<mozilla::UniquePtr<UniqueStacks>>( return mozilla::MakeNotNull<mozilla::UniquePtr<UniqueStacks>>(
std::move(jitFrameInfo), aService); aFailureLatch, std::move(jitFrameInfo), aService);
} }
void ProfiledThreadData::StreamJSON( void ProfiledThreadData::StreamJSON(