haikuwebkit/LayoutTests/inspector/cpu-profiler/threads.html

76 lines
3.8 KiB
HTML
Raw Permalink Normal View History

Web Inspector: Better categorize CPU usage per-thread / worker https://bugs.webkit.org/show_bug.cgi?id=194564 Patch by Joseph Pecoraro <pecoraro@apple.com> on 2019-02-18 Reviewed by Devin Rousso. Source/JavaScriptCore: * inspector/protocol/CPUProfiler.json: Add additional properties per-Event, and new per-Thread object info. Source/WebCore: Test: inspector/cpu-profiler/threads.html * workers/WorkerThread.cpp: (WebCore::WorkerThread::workerThreadsMutex): (WebCore::WorkerThread::workerThreadCount): (WebCore::WorkerThread::WorkerThread): (WebCore::WorkerThread::~WorkerThread): (WebCore::WorkerThread::workerThread): (WebCore::WorkerThread::releaseFastMallocFreeMemoryInAllThreads): * workers/WorkerThread.h: (WebCore::WorkerThread::identifier const): Expose the set of all WorkerThreads. * inspector/agents/InspectorCPUProfilerAgent.cpp: (WebCore::InspectorCPUProfilerAgent::collectSample): Send inspector additional per-thread data. * page/ResourceUsageData.h: (WebCore::WorkerCPUInfo::WorkerCPUInfo): * page/cocoa/ResourceUsageThreadCocoa.mm: (WebCore::ThreadInfo::ThreadInfo): (WebCore::threadInfos): (WebCore::ResourceUsageThread::platformCollectCPUData): (WebCore::threadSendRights): Deleted. (WebCore::cpuUsage): Deleted. Compute per-thread values on cocoa ports. * page/linux/ResourceUsageThreadLinux.cpp: (WebCore::ResourceUsageThread::platformCollectCPUData): Stub per-thread values on linux ports. Source/WebInspectorUI: * UserInterface/Controllers/TimelineManager.js: (WI.TimelineManager.prototype.cpuProfilerTrackingUpdated): * UserInterface/Models/CPUTimelineRecord.js: (WI.CPUTimelineRecord.prototype.get mainThreadUsage): (WI.CPUTimelineRecord.prototype.get webkitThreadUsage): (WI.CPUTimelineRecord.prototype.get workerThreadUsage): (WI.CPUTimelineRecord.prototype.get unknownThreadUsage): Build a better record from the protocol events. Source/WTF: * wtf/Threading.h: * wtf/Threading.cpp: (WTF::Thread::allThreadsMutex): (WTF::Thread::create): (WTF::Thread::didExit): Add a set of all WTF::Thread created threads. LayoutTests: * inspector/cpu-profiler/resources/busy-worker.js: Added. * inspector/cpu-profiler/threads-expected.txt: Added. * inspector/cpu-profiler/threads.html: Added. Test that WebKit receives per-Thread CPU usage numbers. Canonical link: https://commits.webkit.org/209170@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@241739 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-02-18 22:44:06 +00:00
<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<script>
let worker1 = new Worker("resources/busy-worker.js");
let worker2 = new Worker("resources/busy-worker.js");
function test()
{
let suite = ProtocolTest.createAsyncSuite("CPUProfiler.Threads");
suite.addTestCase({
name: "CPUProfiler.Threads",
test(resolve, reject) {
InspectorProtocol.awaitEvent({event: "CPUProfiler.trackingStart"}).then((messageObject) => {
ProtocolTest.log("CPUProfiler.trackingStart");
ProtocolTest.expectThat(typeof messageObject.params.timestamp === "number", "Should have a timestamp when starting.");
});
// Skip one update to be safe. The Workers may not have existed for long.
InspectorProtocol.awaitEvent({event: "CPUProfiler.trackingUpdate"})
.then(() => InspectorProtocol.awaitEvent({event: "CPUProfiler.trackingUpdate"}))
.then((messageObject) => {
ProtocolTest.log("CPUProfiler.trackingUpdate");
ProtocolTest.expectThat(typeof messageObject.params.event === "object", "Should have an event object.");
ProtocolTest.expectThat(typeof messageObject.params.event.timestamp === "number", "Event should have a timestamp.");
ProtocolTest.expectThat(typeof messageObject.params.event.usage === "number", "Event should have a usage.");
ProtocolTest.expectThat(messageObject.params.event.usage >= 0, "usage should be greater than or equal to zero.");
ProtocolTest.expectThat(Array.isArray(messageObject.params.event.threads), "Event should have threads.");
let main = [];
let workers = [];
let others = [];
let threads = messageObject.params.event.threads;
for (let thread of threads) {
if (thread.type === "main")
main.push(thread);
else if (thread.targetId && thread.name == "WebCore: Worker")
Web Inspector: Better categorize CPU usage per-thread / worker https://bugs.webkit.org/show_bug.cgi?id=194564 Patch by Joseph Pecoraro <pecoraro@apple.com> on 2019-02-18 Reviewed by Devin Rousso. Source/JavaScriptCore: * inspector/protocol/CPUProfiler.json: Add additional properties per-Event, and new per-Thread object info. Source/WebCore: Test: inspector/cpu-profiler/threads.html * workers/WorkerThread.cpp: (WebCore::WorkerThread::workerThreadsMutex): (WebCore::WorkerThread::workerThreadCount): (WebCore::WorkerThread::WorkerThread): (WebCore::WorkerThread::~WorkerThread): (WebCore::WorkerThread::workerThread): (WebCore::WorkerThread::releaseFastMallocFreeMemoryInAllThreads): * workers/WorkerThread.h: (WebCore::WorkerThread::identifier const): Expose the set of all WorkerThreads. * inspector/agents/InspectorCPUProfilerAgent.cpp: (WebCore::InspectorCPUProfilerAgent::collectSample): Send inspector additional per-thread data. * page/ResourceUsageData.h: (WebCore::WorkerCPUInfo::WorkerCPUInfo): * page/cocoa/ResourceUsageThreadCocoa.mm: (WebCore::ThreadInfo::ThreadInfo): (WebCore::threadInfos): (WebCore::ResourceUsageThread::platformCollectCPUData): (WebCore::threadSendRights): Deleted. (WebCore::cpuUsage): Deleted. Compute per-thread values on cocoa ports. * page/linux/ResourceUsageThreadLinux.cpp: (WebCore::ResourceUsageThread::platformCollectCPUData): Stub per-thread values on linux ports. Source/WebInspectorUI: * UserInterface/Controllers/TimelineManager.js: (WI.TimelineManager.prototype.cpuProfilerTrackingUpdated): * UserInterface/Models/CPUTimelineRecord.js: (WI.CPUTimelineRecord.prototype.get mainThreadUsage): (WI.CPUTimelineRecord.prototype.get webkitThreadUsage): (WI.CPUTimelineRecord.prototype.get workerThreadUsage): (WI.CPUTimelineRecord.prototype.get unknownThreadUsage): Build a better record from the protocol events. Source/WTF: * wtf/Threading.h: * wtf/Threading.cpp: (WTF::Thread::allThreadsMutex): (WTF::Thread::create): (WTF::Thread::didExit): Add a set of all WTF::Thread created threads. LayoutTests: * inspector/cpu-profiler/resources/busy-worker.js: Added. * inspector/cpu-profiler/threads-expected.txt: Added. * inspector/cpu-profiler/threads.html: Added. Test that WebKit receives per-Thread CPU usage numbers. Canonical link: https://commits.webkit.org/209170@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@241739 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-02-18 22:44:06 +00:00
workers.push(thread);
else
others.push(thread);
}
ProtocolTest.expectThat(threads.every((x) => x.usage >= 0 && x.usage <= 100), "Every thread has between 0 and 100 usage.");
ProtocolTest.expectEqual(main.length, 1, "Event should have 1 main thread.");
ProtocolTest.expectEqual(workers.length, 2, "Event should have 2 worker threads.");
ProtocolTest.expectThat(others.length > 0, "Event should have other worker threads.");
ProtocolTest.expectGreaterThan(workers[0].usage, 0, "Worker 1 usage should be greater than zero.");
ProtocolTest.expectGreaterThan(workers[1].usage, 0, "Worker 2 usage should be greater than zero.");
// Round to 4 decimal digits.
let totalUsage = Number(messageObject.params.event.usage.toFixed(4));
let workersUsage = Number((workers[0].usage + workers[1].usage).toFixed(4));
ProtocolTest.expectGreaterThanOrEqual(totalUsage, workersUsage, "Total usage should be greater than or equal to the sum of both worker threads.");
Web Inspector: Better categorize CPU usage per-thread / worker https://bugs.webkit.org/show_bug.cgi?id=194564 Patch by Joseph Pecoraro <pecoraro@apple.com> on 2019-02-18 Reviewed by Devin Rousso. Source/JavaScriptCore: * inspector/protocol/CPUProfiler.json: Add additional properties per-Event, and new per-Thread object info. Source/WebCore: Test: inspector/cpu-profiler/threads.html * workers/WorkerThread.cpp: (WebCore::WorkerThread::workerThreadsMutex): (WebCore::WorkerThread::workerThreadCount): (WebCore::WorkerThread::WorkerThread): (WebCore::WorkerThread::~WorkerThread): (WebCore::WorkerThread::workerThread): (WebCore::WorkerThread::releaseFastMallocFreeMemoryInAllThreads): * workers/WorkerThread.h: (WebCore::WorkerThread::identifier const): Expose the set of all WorkerThreads. * inspector/agents/InspectorCPUProfilerAgent.cpp: (WebCore::InspectorCPUProfilerAgent::collectSample): Send inspector additional per-thread data. * page/ResourceUsageData.h: (WebCore::WorkerCPUInfo::WorkerCPUInfo): * page/cocoa/ResourceUsageThreadCocoa.mm: (WebCore::ThreadInfo::ThreadInfo): (WebCore::threadInfos): (WebCore::ResourceUsageThread::platformCollectCPUData): (WebCore::threadSendRights): Deleted. (WebCore::cpuUsage): Deleted. Compute per-thread values on cocoa ports. * page/linux/ResourceUsageThreadLinux.cpp: (WebCore::ResourceUsageThread::platformCollectCPUData): Stub per-thread values on linux ports. Source/WebInspectorUI: * UserInterface/Controllers/TimelineManager.js: (WI.TimelineManager.prototype.cpuProfilerTrackingUpdated): * UserInterface/Models/CPUTimelineRecord.js: (WI.CPUTimelineRecord.prototype.get mainThreadUsage): (WI.CPUTimelineRecord.prototype.get webkitThreadUsage): (WI.CPUTimelineRecord.prototype.get workerThreadUsage): (WI.CPUTimelineRecord.prototype.get unknownThreadUsage): Build a better record from the protocol events. Source/WTF: * wtf/Threading.h: * wtf/Threading.cpp: (WTF::Thread::allThreadsMutex): (WTF::Thread::create): (WTF::Thread::didExit): Add a set of all WTF::Thread created threads. LayoutTests: * inspector/cpu-profiler/resources/busy-worker.js: Added. * inspector/cpu-profiler/threads-expected.txt: Added. * inspector/cpu-profiler/threads.html: Added. Test that WebKit receives per-Thread CPU usage numbers. Canonical link: https://commits.webkit.org/209170@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@241739 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-02-18 22:44:06 +00:00
InspectorProtocol.sendCommand("CPUProfiler.stopTracking", {});
}).catch(reject);
InspectorProtocol.awaitEvent({event: "CPUProfiler.trackingComplete"}).then((messageObject) => {
ProtocolTest.log("CPUProfiler.trackingComplete");
resolve();
});
InspectorProtocol.sendCommand("CPUProfiler.startTracking", {});
}
});
suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests that CPUProfiler tracking events include per-Thread CPU usage.</p>
</body>
</html>