Browse Source

WindowServer: Let the CPU monitor keep /proc/all open between refreshes.

Just seek to the beginning on every iteration and start over. This avoids
a bunch of syscalls.
Andreas Kling 6 years ago
parent
commit
bc6ac1c2f2
2 changed files with 7 additions and 4 deletions
  1. 5 4
      Servers/WindowServer/WSCPUMonitor.cpp
  2. 2 0
      Servers/WindowServer/WSCPUMonitor.h

+ 5 - 4
Servers/WindowServer/WSCPUMonitor.cpp

@@ -31,14 +31,15 @@ void WSCPUMonitor::get_cpu_usage(unsigned& busy, unsigned& idle)
     busy = 0;
     idle = 0;
 
-    FILE* fp = fopen("/proc/all", "r");
-    if (!fp) {
+    if (!m_fp)
+        m_fp = fopen("/proc/all", "r");
+    if (!m_fp) {
         perror("failed to open /proc/all");
         ASSERT_NOT_REACHED();
     }
     for (;;) {
         char buf[BUFSIZ];
-        char* ptr = fgets(buf, sizeof(buf), fp);
+        char* ptr = fgets(buf, sizeof(buf), m_fp);
         if (!ptr)
             break;
         auto parts = String(buf, Chomp).split(',');
@@ -55,7 +56,7 @@ void WSCPUMonitor::get_cpu_usage(unsigned& busy, unsigned& idle)
         else
             busy += nsched;
     }
-    int rc = fclose(fp);
+    int rc = fseek(m_fp, 0, SEEK_SET);
     ASSERT(rc == 0);
 }
 

+ 2 - 0
Servers/WindowServer/WSCPUMonitor.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include <AK/CircularQueue.h>
+#include <stdio.h>
 
 class Painter;
 class Rect;
@@ -18,5 +19,6 @@ private:
     void get_cpu_usage(unsigned& busy, unsigned& idle);
 
     CircularQueue<float, 30> m_cpu_history;
+    FILE* m_fp { nullptr };
     bool m_dirty { false };
 };