10 UMLClass 70 110 300 70 /PProfilerParent/ bg=light_gray -- *+SendAwaitNextChunkManagerUpdate()* *+SendDestroyReleasedChunksAtOrBefore()* UMLClass 470 20 210 70 *ProfileBufferChunkMetadata* bg=light_gray -- +doneTimeStamp +bufferBytes UMLClass 780 110 330 70 /PProfilerChild/ bg=light_gray -- */+RecvAwaitNextChunkManagerUpdate() = 0/* */+RecvDestroyReleasedChunksAtOrBefore() = 0/* UMLClass 110 260 220 70 ProfilerParent -- *-processId* -- Relation 210 170 30 110 lt=<<- 10.0;10.0;10.0;90.0 UMLClass 740 250 410 90 ProfilerChild -- -UpdateStorage: unreleased bytes, released: {pid, rangeStart[ ]} -- *+RecvAwaitNextChunkUpdate()* *+RecvDestroyReleasedChunksAtOrBefore()* Relation 930 170 30 100 lt=<<- 10.0;10.0;10.0;80.0 UMLClass 110 400 220 70 ProfilerParentTracker -- _+Enumerate()_ _*+ForChild()*_ Relation 210 320 190 100 lt=<- m1=0..n nsTArray<ProfilerParent*> 10.0;10.0;10.0;80.0 UMLClass 80 1070 150 30 ProfileBufferChunk UMLClass 380 1070 210 30 /ProfileBufferChunkManager/ UMLClass 180 900 700 50 ProfileBufferChunkManagerWithLocalLimit -- -mUpdateCallback Relation 480 940 30 150 lt=<<- 10.0;130.0;10.0;10.0 UMLClass 380 1200 210 30 ProfileChunkedBuffer Relation 410 1090 140 130 lt=->>>> mChunkManager 10.0;10.0;10.0;110.0 UMLClass 960 1200 100 30 CorePS UMLClass 960 1040 100 30 ActivePS Relation 580 1200 400 40 lt=->>>>> mCoreBuffer 10.0;20.0;380.0;20.0 Relation 870 940 250 120 lt=->>>>> mProfileBufferChunkManager 10.0;10.0;90.0;100.0 UMLClass 830 1140 100 30 ProfileBuffer Relation 920 1060 130 110 lt=->>>>> mProfileBuffer 10.0;90.0;40.0;10.0 Relation 580 1160 270 70 lt=->>>> mEntries 10.0;50.0;250.0;10.0 Relation 90 1090 310 150 lt=->>>>> m1=0..1 mCurrentChunk: UniquePtr<> 10.0;10.0;10.0;130.0;290.0;130.0 Relation 210 1080 200 150 lt=->>>>> m1=0..N mNextChunks: UniquePtr<> 20.0;10.0;170.0;130.0 Relation 200 940 230 150 lt=->>>>> m1=0..N mReleasedChunks: UniquePtr<> 10.0;130.0;10.0;10.0 Relation 530 1090 270 130 lt=->>>>> mOwnedChunkManager: UniquePtr<> 10.0;10.0;10.0;110.0 UMLClass 480 390 550 150 *ProfileBufferGlobalController* -- -mMaximumBytes -mCurrentUnreleasedBytesTotal -mCurrentUnreleasedBytes: {pid, unreleased bytes}[ ] sorted by pid -mCurrentReleasedBytes -mReleasedChunks: {doneTimeStamp, bytes, pid}[ ] sorted by timestamp -mDestructionCallback: function<void(pid, rangeStart)> -- +Update(pid, unreleased bytes, released: ProfileBufferChunkMetadata[ ]) Relation 320 420 180 40 lt=->>>>> mController 160.0;20.0;10.0;20.0 Relation 20 400 110 80 lt=->>>>> _sInstance_ 90.0;60.0;10.0;60.0;10.0;10.0;90.0;10.0 UMLNote 480 250 220 120 The controller is only needed if there *are* child processes, so we can create it with the first child (at which point the tracker can register itself with the local profiler), and destroyed with the last child. bg=blue Relation 690 330 100 80 10.0;10.0;80.0;60.0 Relation 130 460 200 380 lt=->>>> mParentChunkManager 180.0;360.0;10.0;360.0;10.0;10.0 Relation 740 330 350 510 lt=->>>> mLocalBufferChunkManager 10.0;490.0;330.0;490.0;330.0;10.0 UMLClass 470 650 400 100 *ProfileBufferControlledChunkManager::Update* -- -mUnreleasedBytes -mReleasedBytes -mOldestDoneTimeStamp -mNewReleasedChunks: ChunkMetadata[ ] UMLClass 470 560 400 60 *ProfileBufferControlledChunkManager::ChunkMetadata* -- -mDoneTimeStamp -mBufferBytes Relation 670 610 30 60 lt=<. 10.0;10.0;10.0;40.0 Relation 670 740 30 60 lt=<. 10.0;10.0;10.0;40.0 Relation 670 50 130 110 lt=<. 10.0;10.0;110.0;90.0 Relation 360 50 130 110 lt=<. 110.0;10.0;10.0;90.0 UMLClass 400 130 350 100 *ProfileBufferChunkManagerUpdate* bg=light_gray -- -unreleasedBytes -releasedBytes -oldestDoneTimeStamp -newlyReleasedChunks: ProfileBufferChunkMetadata[ ] UMLClass 310 780 440 70 *ProfileBufferControlledChunkManager* -- */+SetUpdateCallback(function<void(update: Update&&)>)/* */+DestroyChunksAtOrBefore(timeStamp)/* Relation 480 840 30 80 lt=<<- 10.0;10.0;10.0;60.0