Fix divide-by-zero in RuntimeEventSourceHelper.GetCpuUsage on Windows (#56547)
authorStephen Toub <stoub@microsoft.com>
Fri, 30 Jul 2021 10:58:47 +0000 (06:58 -0400)
committerGitHub <noreply@github.com>
Fri, 30 Jul 2021 10:58:47 +0000 (06:58 -0400)
src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/RuntimeEventSourceHelper.Windows.cs

index 069c55c..7dc8b40 100644 (file)
@@ -14,33 +14,25 @@ namespace System.Diagnostics.Tracing
         {
             // Returns the current process' CPU usage as a percentage
 
-            int cpuUsage;
+            int cpuUsage = 0;
 
-            if (!Interop.Kernel32.GetProcessTimes(Interop.Kernel32.GetCurrentProcess(), out _, out _, out long procKernelTime, out long procUserTime))
-            {
-                return 0;
-            }
-
-            if (!Interop.Kernel32.GetSystemTimes(out _, out long systemUserTime, out long systemKernelTime))
-            {
-                return 0;
-            }
-
-            if (s_prevSystemUserTime == 0 && s_prevSystemKernelTime == 0) // These may be 0 when we report CPU usage for the first time, in which case we should just return 0.
-            {
-                cpuUsage = 0;
-            }
-            else
+            if (Interop.Kernel32.GetProcessTimes(Interop.Kernel32.GetCurrentProcess(), out _, out _, out long procKernelTime, out long procUserTime) &&
+                Interop.Kernel32.GetSystemTimes(out _, out long systemUserTime, out long systemKernelTime))
             {
                 long totalProcTime = (procUserTime - s_prevProcUserTime) + (procKernelTime - s_prevProcKernelTime);
                 long totalSystemTime = (systemUserTime - s_prevSystemUserTime) + (systemKernelTime - s_prevSystemKernelTime);
-                cpuUsage = (int)(totalProcTime * 100 / totalSystemTime);
-            }
 
-            s_prevProcUserTime = procUserTime;
-            s_prevProcKernelTime = procKernelTime;
-            s_prevSystemUserTime = systemUserTime;
-            s_prevSystemKernelTime = systemKernelTime;
+                if (s_prevSystemUserTime != 0 && s_prevSystemKernelTime != 0 && // These may be 0 when we report CPU usage for the first time, in which case we should just return 0.
+                    totalSystemTime != 0)
+                {
+                    cpuUsage = (int)(totalProcTime * 100 / totalSystemTime);
+                }
+
+                s_prevProcUserTime = procUserTime;
+                s_prevProcKernelTime = procKernelTime;
+                s_prevSystemUserTime = systemUserTime;
+                s_prevSystemKernelTime = systemKernelTime;
+            }
 
             return cpuUsage;
         }