chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
bootchart: parse /etc/os-release rather than system-release
[elogind.git]
/
src
/
bootchart
/
log.c
diff --git
a/src/bootchart/log.c
b/src/bootchart/log.c
index c7973a528502f552b72e6c5e492a70d628ebf22a..cf6c3a73f6bbe0214262d1c706de953550bd5d69 100644
(file)
--- a/
src/bootchart/log.c
+++ b/
src/bootchart/log.c
@@
-43,7
+43,7
@@
*/
static char smaps_buf[4096];
DIR *proc;
*/
static char smaps_buf[4096];
DIR *proc;
-
+int procfd=-1;
double gettime_ns(void)
{
double gettime_ns(void)
{
@@
-62,6
+62,7
@@
void log_uptime(void)
double uptime;
f = fopen("/proc/uptime", "r");
double uptime;
f = fopen("/proc/uptime", "r");
+
if (!f)
return;
if (!fscanf(f, "%s %*s", str)) {
if (!f)
return;
if (!fscanf(f, "%s %*s", str)) {
@@
-113,10
+114,22
@@
void log_sample(int sample)
ssize_t s;
ssize_t n;
struct dirent *ent;
ssize_t s;
ssize_t n;
struct dirent *ent;
+ int fd;
+
+ /* all the per-process stuff goes here */
+ if (!proc) {
+ /* find all processes */
+ proc = opendir("/proc");
+ if (!proc)
+ return;
+ procfd = dirfd(proc);
+ } else {
+ rewinddir(proc);
+ }
if (!vmstat) {
/* block stuff */
if (!vmstat) {
/* block stuff */
- vmstat = open
("/proc/
vmstat", O_RDONLY);
+ vmstat = open
at(procfd, "
vmstat", O_RDONLY);
if (vmstat == -1) {
perror("open /proc/vmstat");
exit (EXIT_FAILURE);
if (vmstat == -1) {
perror("open /proc/vmstat");
exit (EXIT_FAILURE);
@@
-148,7
+161,7
@@
vmstat_next:
if (!schedstat) {
/* overall CPU utilization */
if (!schedstat) {
/* overall CPU utilization */
- schedstat = open
("/proc/
schedstat", O_RDONLY);
+ schedstat = open
at(procfd, "
schedstat", O_RDONLY);
if (schedstat == -1) {
perror("open /proc/schedstat");
exit (EXIT_FAILURE);
if (schedstat == -1) {
perror("open /proc/schedstat");
exit (EXIT_FAILURE);
@@
-186,7
+199,7
@@
schedstat_next:
if (entropy) {
if (!e_fd) {
if (entropy) {
if (!e_fd) {
- e_fd = open
("/proc/
sys/kernel/random/entropy_avail", O_RDONLY);
+ e_fd = open
at(procfd, "
sys/kernel/random/entropy_avail", O_RDONLY);
}
if (e_fd) {
}
if (e_fd) {
@@
-198,16
+211,6
@@
schedstat_next:
}
}
}
}
- /* all the per-process stuff goes here */
- if (!proc) {
- /* find all processes */
- proc = opendir("/proc");
- if (!proc)
- return;
- } else {
- rewinddir(proc);
- }
-
while ((ent = readdir(proc)) != NULL) {
char filename[PATH_MAX];
int pid;
while ((ent = readdir(proc)) != NULL) {
char filename[PATH_MAX];
int pid;
@@
-254,8
+257,8
@@
schedstat_next:
/* get name, start time */
if (!ps->sched) {
/* get name, start time */
if (!ps->sched) {
- sprintf(filename, "
/proc/
%d/sched", pid);
- ps->sched = open
(
filename, O_RDONLY);
+ sprintf(filename, "%d/sched", pid);
+ ps->sched = open
at(procfd,
filename, O_RDONLY);
if (ps->sched == -1)
continue;
}
if (ps->sched == -1)
continue;
}
@@
-286,8
+289,9
@@
schedstat_next:
ps->starttime = strtod(t, NULL) / 1000.0;
/* ppid */
ps->starttime = strtod(t, NULL) / 1000.0;
/* ppid */
- sprintf(filename, "/proc/%d/stat", pid);
- st = fopen(filename, "r");
+ sprintf(filename, "%d/stat", pid);
+ fd = openat(procfd, filename, O_RDONLY);
+ st = fdopen(fd, "r");
if (!st)
continue;
if (!fscanf(st, "%*s %*s %*s %i", &p)) {
if (!st)
continue;
if (!fscanf(st, "%*s %*s %*s %i", &p)) {
@@
-342,8
+346,8
@@
schedstat_next:
/* rt, wt */
if (!ps->schedstat) {
/* rt, wt */
if (!ps->schedstat) {
- sprintf(filename, "
/proc/
%d/schedstat", pid);
- ps->schedstat = open
(
filename, O_RDONLY);
+ sprintf(filename, "%d/schedstat", pid);
+ ps->schedstat = open
at(procfd,
filename, O_RDONLY);
if (ps->schedstat == -1)
continue;
}
if (ps->schedstat == -1)
continue;
}
@@
-374,8
+378,9
@@
schedstat_next:
goto catch_rename;
/* Pss */
if (!ps->smaps) {
goto catch_rename;
/* Pss */
if (!ps->smaps) {
- sprintf(filename, "/proc/%d/smaps", pid);
- ps->smaps = fopen(filename, "r");
+ sprintf(filename, "%d/smaps", pid);
+ fd = openat(procfd, filename, O_RDONLY);
+ ps->smaps = fdopen(fd, "r");
if (!ps->smaps)
continue;
setvbuf(ps->smaps, smaps_buf, _IOFBF, sizeof(smaps_buf));
if (!ps->smaps)
continue;
setvbuf(ps->smaps, smaps_buf, _IOFBF, sizeof(smaps_buf));
@@
-408,8
+413,8
@@
catch_rename:
/* re-fetch name */
/* get name, start time */
if (!ps->sched) {
/* re-fetch name */
/* get name, start time */
if (!ps->sched) {
- sprintf(filename, "
/proc/
%d/sched", pid);
- ps->sched = open
(
filename, O_RDONLY);
+ sprintf(filename, "%d/sched", pid);
+ ps->sched = open
at(procfd,
filename, O_RDONLY);
if (ps->sched == -1)
continue;
}
if (ps->sched == -1)
continue;
}