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.
This commit is contained in:
Andreas Kling 2019-04-15 23:57:31 +02:00
parent 30b0e5f82e
commit bc6ac1c2f2
Notes: sideshowbarker 2024-07-19 14:41:49 +09:00
2 changed files with 7 additions and 4 deletions

View file

@ -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);
}

View file

@ -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 };
};