10 UMLClass 80 370 340 190 ThreadInfo -- -mName: nsCString -mRegisterTime: TimeStamp -mThreadId: int -mIsMainThread: bool -- NS_INLINE_DECL_THREADSAFE_REFCOUNTING +Name() +RegisterTime() +ThreadId() +IsMainThread() UMLClass 470 300 600 260 RacyRegisteredThread -- -mProfilingStackOwner: NotNull<RefPtr<ProfilingStackOwner>> -mThreadId -mSleep: Atomic<int> /* AWAKE, SLEEPING_NOT_OBSERVED, SLEEPING_OBSERVED */ -mIsBeingProfiled: Atomic<bool, Relaxed> -- +SetIsBeingProfiled() +IsBeingProfiled() +ReinitializeOnResume() +CanDuplicateLastSampleDueToSleep() +SetSleeping() +SetAwake() +IsSleeping() +ThreadId() +ProfilingStack() +ProfilingStackOwner() UMLClass 470 650 350 360 RegisteredThread -- -mPlatformData: UniquePlatformData -mStackTop: const void* -mThread: nsCOMPtr<nsIThread> -mContext: JSContext* -mJSSampling: enum {INACTIVE, ACTIVE_REQUESTED, ACTIVE, INACTIVE_REQUESTED} -mmJSFlags: uint32_t -- +RacyRegisteredThread() +GetPlatformData() +StackTop() +GetRunningEventDelay() +SizeOfIncludingThis() +SetJSContext() +ClearJSContext() +GetJSContext() +Info(): RefPtr<ThreadInfo> +GetEventTarget(): nsCOMPtr<nsIEventTarget> +ResetMainThread(nsIThread*) +StartJSSampling() +StopJSSampling() +PollJSSampling() Relation 750 550 180 120 lt=<<<<<- mRacyRegisteredThread 10.0;100.0;10.0;10.0 Relation 290 550 230 120 lt=<<<<- mThreadInfo: RefPtr<> 210.0;100.0;10.0;10.0 UMLClass 70 660 340 190 PageInformation -- -mBrowsingContextID: uint64_t -mInnerWindowID: uint64_t -mUrl: nsCString -mEmbedderInnerWindowID: uint64_t -- NS_INLINE_DECL_THREADSAFE_REFCOUNTING +SizeOfIncludingThis(MallocSizeOf) +Equals(PageInformation*) +StreamJSON(SpliceableJSONWriter&) +InnerWindowID() +BrowsingContextID() +Url() +EmbedderInnerWindowID() +BufferPositionWhenUnregistered(): Maybe<uint64_t> +NotifyUnregistered(aBufferPosition: uint64_t) UMLClass 760 1890 570 120 ProfilerBacktrace -- -mName: UniqueFreePtr<char> -mThreadId: int -mProfileChunkedBuffer: UniquePtr<ProfileChunkedBuffer> -mProfileBuffer: UniquePtr<ProfileBuffer> -- +StreamJSON(SpliceableJSONWriter&, aProcessStartTime: TimeStamp, UniqueStacks&) UMLClass 20 2140 620 580 ProfileChunkedBuffer -- -mMutex: BaseProfilerMaybeMutex -mChunkManager: ProfileBufferChunkManager* -mOwnedChunkManager: UniquePtr<ProfileBufferChunkManager> -mCurrentChunk: UniquePtr<ProfileBufferChunk> -mNextChunks: UniquePtr<ProfileBufferChunk> -mRequestedChunkHolder: RefPtr<RequestedChunkRefCountedHolder> -mNextChunkRangeStart: ProfileBufferIndex -mRangeStart: Atomic<ProfileBufferIndex, ReleaseAcquire> -mRangeEnd: ProfileBufferIndex -mPushedBlockCount: uint64_t -mClearedBlockCount: Atomic<uint64_t, ReleaseAcquire> -- +Byte = ProfileBufferChunk::Byte +Length = ProfileBufferChunk::Length +IsThreadSafe() +IsInSession() +ResetChunkManager() +SetChunkManager() +Clear() +BufferLength(): Maybe<size_t> +SizeOfExcludingThis(MallocSizeOf) +SizeOfIncludingThis(MallocSizeOf) +GetState() +IsThreadSafeAndLockedOnCurrentThread(): bool +LockAndRun(Callback&&) +ReserveAndPut(CallbackEntryBytes&&, Callback<auto(Maybe<ProfileBufferEntryWriter>&)>&&) +Put(aEntryBytes: Length, Callback<auto(Maybe<ProfileBufferEntryWriter>&)>&&) +PutFrom(const void*, Length) +PutObjects(const Ts&...) +PutObject(const T&) +GetAllChunks() +Read(Callback<void(Reader&)>&&): bool +ReadEach(Callback<void(ProfileBufferEntryReader& [, ProfileBufferBlockIndex])>&&) +ReadAt(ProfileBufferBlockIndex, Callback<void(Maybe<ProfileBufferEntryReader>&&)>&&) +AppendContents UMLClass 810 2100 500 620 ProfileBufferChunk -- +Header: { mOffsetFirstBlock; mOffsetPastLastBlock; mDoneTimeStamp; mBufferBytes; mBlockCount; mRangeStart; mProcessId; } -InternalHeader: { mHeader: Header; mNext: UniquePtr<ProfileBufferChunk>; } -- -mInternalHeader: InternalHeader -mBuffer: Byte /* First byte */ -- +Byte = uint8_t +Length = uint32_t +SpanOfBytes = Span<Byte> /+Create(aMinBufferBytes: Length): UniquePtr<ProfileBufferChunk>/ +ReserveInitialBlockAsTail(Length): SpanOfBytes +ReserveBlock(Length): { SpanOfBytes, ProfileBufferBlockIndex } +MarkDone() +MarkRecycled() +ChunkHeader() +BufferBytes() +ChunkBytes() +SizeOfExcludingThis(MallocSizeOf) +SizeOfIncludingThis(MallocSizeOf) +RemainingBytes(): Length +OffsetFirstBlock(): Length +OffsetPastLastBlock(): Length +BlockCount(): Length +ProcessId(): int +SetProcessId(int) +RangeStart(): ProfileBufferIndex +SetRangeStart(ProfileBufferIndex) +BufferSpan(): Span<const Byte> +ByteAt(aOffset: Length) +GetNext(): maybe-const ProfileBufferChunk* +ReleaseNext(): UniquePtr<ProfileBufferChunk> +InsertNext(UniquePtr<ProfileBufferChunk>&&) +Last(): const ProfileBufferChunk* +SetLast(UniquePtr<ProfileBufferChunk>&&) /+Join(UniquePtr<ProfileBufferChunk>&&, UniquePtr<ProfileBufferChunk>&&)/ UMLClass 120 2850 570 350 ProfileBufferEntryReader -- -mCurrentSpan: SpanOfConstBytes -mNextSpanOrEmpty: SpanOfConstBytes -mCurrentBlockIndex: ProfileBufferBlockIndex -mNextBlockIndex: ProfileBufferBlockIndex -- +RemainingBytes(): Length +SetRemainingBytes(Length) +CurrentBlockIndex(): ProfileBufferBlockIndex +NextBlockIndex(): ProfileBufferBlockIndex +EmptyIteratorAtOffset(Length): ProfileBufferEntryReader +operator*(): const Byte& +operator++(): ProfileBufferEntryReader& +operator+=(Length): ProfileBufferEntryReader& +operator==(const ProfileBufferEntryReader&) +operator!=(const ProfileBufferEntryReader&) +ReadULEB128<T>(): T +ReadBytes(void*, Length) +ReadIntoObject(T&) +ReadIntoObjects(Ts&...) +ReadObject<T>(): T UMLClass 740 2850 570 300 ProfileBufferEntryWriter -- -mCurrentSpan: SpanOfBytes -mNextSpanOrEmpty: SpanOfBytes -mCurrentBlockIndex: ProfileBufferBlockIndex -mNextBlockIndex: ProfileBufferBlockIndex -- +RemainingBytes(): Length +CurrentBlockIndex(): ProfileBufferBlockIndex +NextBlockIndex(): ProfileBufferBlockIndex +operator*(): Byte& +operator++(): ProfileBufferEntryReader& +operator+=(Length): ProfileBufferEntryReader& /+ULEB128Size(T): unsigned/ +WriteULEB128(T) /+SumBytes(const Ts&...): Length/ +WriteFromReader(ProfileBufferEntryReader&, Length) +WriteObject(const T&) +WriteObjects(const T&) UMLClass 120 3270 570 80 ProfileBufferEntryReader::Deserializer<T> /to be specialized for all types read from ProfileBufferEntryReader/ -- /+ReadInto(ProfileBufferEntryReader&, T&)/ /+Read<T>(ProfileBufferEntryReader&): T/ UMLClass 740 3270 570 80 ProfileBufferEntryWriter::Serializer<T> /to be specialized for all types written into ProfileBufferEntryWriter/ -- /+Bytes(const T&): Length/ /+Write(ProfileBufferEntryWriter&, const T&)/ Relation 330 2710 110 160 lt=.> <<creates>> 10.0;10.0;60.0;140.0 Relation 430 2710 360 160 lt=.> <<creates>> 10.0;10.0;340.0;140.0 Relation 660 2710 260 160 lt=.> <<points into>> 10.0;140.0;240.0;10.0 Relation 870 2710 140 160 lt=.> <<points into>> 10.0;140.0;80.0;10.0 Relation 630 2170 200 40 lt=<<<<- mCurrentChunk 10.0;20.0;180.0;20.0 Relation 630 2230 200 40 lt=<<<<- mNextChunks 10.0;20.0;180.0;20.0 Relation 1100 2030 170 90 lt=<<<<- mInternalHeader.mNext 10.0;70.0;10.0;20.0;150.0;20.0;150.0;70.0 Relation 490 3190 70 100 lt=.> <<uses>> 10.0;10.0;10.0;80.0 Relation 580 3190 230 100 lt=.> <<uses>> 10.0;10.0;210.0;80.0 UMLClass 50 1620 570 410 ProfileBuffer -- -mFirstSamplingTimeNs: double -mLastSamplingTimeNs: double -mIntervalNs, etc.: ProfilerStats -- +IsThreadSafe(): bool +AddEntry(const ProfileBufferEntry&): uint64_t +AddThreadIdEntry(int): uint64_t +PutObjects(Kind, const Ts&...): ProfileBufferBlockIndex +CollectCodeLocation(...) +AddJITInfoForRange(...) +StreamSamplesToJSON(SpliceableJSONWriter&, aThreadId: int, aSinceTime: double, UniqueStacks&) +StreamMarkersToJSON(SpliceableJSONWriter&, ...) +StreamPausedRangesToJSON(SpliceableJSONWriter&, aSinceTime: double) +StreamProfilerOverheadToJSON(SpliceableJSONWriter&, ...) +StreamCountersToJSON(SpliceableJSONWriter&, ...) +DuplicateLsstSample +DiscardSamplesBeforeTime(aTime: double) +GetEntry(aPosition: uint64_t): ProfileBufferEntry +SizeOfExcludingThis(MallocSizeOf) +SizeOfIncludingThis(MallocSizeOf) +CollectOverheadStats(...) +GetProfilerBufferInfo(): ProfilerBufferInfo +BufferRangeStart(): uint64_t +BufferRangeEnd(): uint64_t UMLClass 690 1620 230 60 ProfileBufferEntry -- +mKind: Kind +mStorage: uint8_t[kNumChars=8] UMLClass 930 1620 440 130 UniqueJSONStrings -- -mStringTableWriter: SpliceableChunkedJSONWriter -mStringHashToIndexMap: HashMap<HashNumber, uint32_t> -- +SpliceStringTableElements(SpliceableJSONWriter&) +WriteProperty(JSONWriter&, aName: const char*, aStr: const char*) +WriteElement(JSONWriter&, aStr: const char*) +GetOrAddIndex(const char*): uint32_t UMLClass 680 1760 470 110 UniqueStack -- -mFrameTableWriter: SpliceableChunkedJSONWriter -mFrameToIndexMap: HashMap<FrameKey, uint32_t, FrameKeyHasher> -mStackTableWriter: SpliceableChunkedJSONWriter -mStackToIndexMap: HashMap<StackKey, uint32_t, StackKeyHasher> -mJITInfoRanges: Vector<JITFrameInfoForBufferRange> Relation 320 2020 230 140 lt=<<<<- mEntries: ProfileChunkedBuffer& 10.0;10.0;10.0;120.0 Relation 610 1640 100 40 lt=.> <<uses>> 10.0;20.0;80.0;20.0 Relation 610 1710 340 40 lt=.> <<uses>> 10.0;20.0;320.0;20.0 Relation 610 1800 90 40 lt=.> <<uses>> 10.0;20.0;70.0;20.0 Relation 610 1900 170 40 lt=<<<<- mProfileBuffer 150.0;20.0;10.0;20.0 Relation 590 1940 250 220 lt=<<<<- mProfileChunkedBuffer 170.0;10.0;10.0;200.0 UMLClass 20 1030 490 550 CorePS -- /-sInstance: CorePS*/ -mMainThreadId: int -mProcessStartTime: TimeStamp -mCoreBuffer: ProfileChunkedBuffer -mRegisteredThreads: Vector<UniquePtr<RegisteredThread>> -mRegisteredPages: Vector<RefPtr<PageInformation>> -mCounters: Vector<BaseProfilerCount*> -mLul: UniquePtr<lul::LUL> /* linux only */ -mProcessName: nsAutoCString -mJsFrames: JsFrameBuffer -- +Create +Destroy +Exists(): bool +AddSizeOf(...) +MainThreadId() +ProcessStartTime() +CoreBuffer() +RegisteredThreads(PSLockRef) +JsFrames(PSLockRef) /+AppendRegisteredThread(PSLockRef, UniquePtr<RegisteredThread>)/ /+RemoveRegisteredThread(PSLockRef, RegisteredThread*)/ +RegisteredPages(PSLockRef) /+AppendRegisteredPage(PSLockRef, RefPtr<PageInformation>)/ /+RemoveRegisteredPage(PSLockRef, aRegisteredInnerWindowID: uint64_t)/ /+ClearRegisteredPages(PSLockRef)/ +Counters(PSLockRef) +AppendCounter +RemoveCounter +Lul(PSLockRef) +SetLul(PSLockRef, UniquePtr<lul::LUL>) +ProcessName(PSLockRef) +SetProcessName(PSLockRef, const nsACString&) Relation 20 1570 110 590 lt=<<<<<- mCoreBuffer 10.0;10.0;10.0;570.0 Relation 160 840 150 210 lt=<<<<- mRegisteredPages 10.0;190.0;10.0;10.0 Relation 250 840 240 210 lt=<<<<- mRegisteredThreads 10.0;190.0;220.0;10.0 UMLClass 920 860 340 190 SamplerThread -- -mSampler: Sampler -mActivityGeneration: uint32_t -mIntervalMicroseconds: int -mThread /* OS-specific */ -mPostSamplingCallbackList: UniquePtr<PostSamplingCallbackListItem> -- +Run() +Stop(PSLockRef) +AppendPostSamplingCallback(PSLockRef, PostSamplingCallback&&) UMLClass 1060 600 340 190 Sampler -- -mOldSigprofHandler: sigaction -mMyPid: int -mSamplerTid: int +sSigHandlerCoordinator -- +Disable(PSLockRef) +SuspendAndSampleAndResumeThread(PSLockRef, const RegisteredThread&, aNow: TimeStamp, const Func&) Relation 1190 780 90 100 lt=<<<<<- mSampler 10.0;80.0;10.0;10.0 UMLClass 610 1130 470 400 ActivePS -- /-sInstance: ActivePS*/ -mGeneration: const uint32_t /-sNextGeneration: uint32_t/ -mCapacity: const PowerOfTwo -mDuration: const Maybe<double> -mInterval: const double /* milliseconds */ -mFeatures: const uint32_t -mFilters: Vector<std::string> -mActiveBrowsingContextID: uint64_t -mProfileBufferChunkManager: ProfileBufferChunkManagerWithLocalLimit -mProfileBuffer: ProfileBuffer -mLiveProfiledThreads: Vector<LiveProfiledThreadData> -mDeadProfiledThreads: Vector<UniquePtr<ProfiledThreadData>> -mDeadProfiledPages: Vector<RefPtr<PageInformation>> -mSamplerThread: SamplerThread* const -mInterposeObserver: RefPtr<ProfilerIOInterposeObserver> -mPaused: bool -mWasPaused: bool /* linux */ -mBaseProfileThreads: UniquePtr<char[]> -mGeckoIndexWhenBaseProfileAdded: ProfileBufferBlockIndex -mExitProfiles: Vector<ExitProfile> -- + Relation 970 1040 140 110 lt=<<<<- mSamplerThread 10.0;90.0;10.0;10.0 UMLNote 500 160 510 100 bg=red This document pre-dates the generated image profilerclasses-20220913.png! Unfortunately, the changes to make the image were lost. This previous version may still be useful to start reconstructing the image, if there is a need to update it.