Bug Bug 1882552 - Add logging to QoS signals r=xpcom-reviewers,barret

Adds logging for Qos overrides, changes, override removals, setting shutdown, and refusing QoS changes due to shutdown.

Differential Revision: https://phabricator.services.mozilla.com/D203271
This commit is contained in:
kriswright 2024-03-08 17:25:25 +00:00
parent 177b0c2154
commit 54b4354d8e

View File

@ -86,6 +86,8 @@ using namespace mozilla::ipc;
namespace { namespace {
LazyLogModule gQoSLog("QoSPriority"); // For RecvSetMainThreadQoSPriority.
/* Child process objects */ /* Child process objects */
class HangMonitorChild : public PProcessHangMonitorChild, class HangMonitorChild : public PProcessHangMonitorChild,
@ -649,9 +651,21 @@ mozilla::ipc::IPCResult HangMonitorChild::RecvCancelContentJSExecutionIfRunning(
return IPC_OK(); return IPC_OK();
} }
const char* DefineQoS(const nsIThread::QoSPriority& aQoSPriority) {
if (aQoSPriority == nsIThread::QOS_PRIORITY_LOW) {
return "BACKGROUND";
}
// As of right now, all non-low QoS priorities default to the thread's normal
// priority.
return "NORMAL";
}
mozilla::ipc::IPCResult HangMonitorChild::RecvSetMainThreadQoSPriority( mozilla::ipc::IPCResult HangMonitorChild::RecvSetMainThreadQoSPriority(
const nsIThread::QoSPriority& aQoSPriority) { const nsIThread::QoSPriority& aQoSPriority) {
MOZ_RELEASE_ASSERT(IsOnThread()); MOZ_RELEASE_ASSERT(IsOnThread());
MOZ_LOG(gQoSLog, LogLevel::Debug,
("Priority change %s recieved by content process.",
DefineQoS(aQoSPriority)));
#ifdef XP_MACOSX #ifdef XP_MACOSX
// If the new priority is the background (low) priority, we can tell the OS to // If the new priority is the background (low) priority, we can tell the OS to
@ -670,14 +684,22 @@ mozilla::ipc::IPCResult HangMonitorChild::RecvSetMainThreadQoSPriority(
pthread_override_qos_class_start_np(mMainPThread, qosClass, 0); pthread_override_qos_class_start_np(mMainPThread, qosClass, 0);
if (NS_FAILED(NS_DispatchToMainThread(NS_NewRunnableFunction( if (NS_FAILED(NS_DispatchToMainThread(NS_NewRunnableFunction(
"HangMonitorChild::RecvSetMainThreadQoSPriority", "HangMonitorChild::RecvSetMainThreadQoSPriority",
[qosClass, qosOverride] { [qosClass, qosOverride, aQoSPriority] {
MOZ_LOG(
gQoSLog, LogLevel::Debug,
("Override %s sent to main thread.", DefineQoS(aQoSPriority)));
pthread_set_qos_class_self_np(qosClass, 0); pthread_set_qos_class_self_np(qosClass, 0);
if (qosOverride) { if (qosOverride) {
pthread_override_qos_class_end_np(qosOverride); pthread_override_qos_class_end_np(qosOverride);
MOZ_LOG(gQoSLog, LogLevel::Debug,
("Override %s removed from main thread.",
DefineQoS(aQoSPriority)));
} }
})))) { })))) {
// If we fail to dispatch, go ahead and end the override anyway. // If we fail to dispatch, go ahead and end the override anyway.
pthread_override_qos_class_end_np(qosOverride); pthread_override_qos_class_end_np(qosOverride);
MOZ_LOG(gQoSLog, LogLevel::Debug,
("Override %s removed from main thread.", DefineQoS(aQoSPriority)));
} }
#endif #endif