chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Classify processes from sessions into cgroups
[elogind.git]
/
src
/
shared
/
cgroup-show.c
diff --git
a/src/shared/cgroup-show.c
b/src/shared/cgroup-show.c
index 9ee532ca22271c3dee9f5d0385668975b7f9d4a5..cbd94e86d9166068e2dc657e7ed94c2f1f0b429c 100644
(file)
--- a/
src/shared/cgroup-show.c
+++ b/
src/shared/cgroup-show.c
@@
-40,43
+40,24
@@
static int compare(const void *a, const void *b) {
return 0;
}
return 0;
}
-static
unsigned ilog10(unsigned long ul
) {
-
int n = 0
;
+static
void show_pid_array(pid_t pids[], unsigned n_pids, const char *prefix, unsigned n_columns, bool extra, bool more, bool kernel_threads, OutputFlags flags
) {
+
unsigned i, j, pid_width
;
- while (ul > 0) {
- n++;
- ul /= 10;
- }
-
- return n;
-}
+ if (n_pids == 0)
+ return;
-static void show_pid_array(int pids[], unsigned n_pids, const char *prefix, unsigned n_columns, bool extra, bool more, bool kernel_threads, OutputFlags flags) {
- unsigned i, m, pid_width;
- pid_t biggest = 0;
+ qsort(pids, n_pids, sizeof(pid_t), compare);
/* Filter duplicates */
/* Filter duplicates */
- m = 0;
- for (i = 0; i < n_pids; i++) {
- unsigned j;
-
- if (pids[i] > biggest)
- biggest = pids[i];
-
- for (j = i+1; j < n_pids; j++)
- if (pids[i] == pids[j])
- break;
-
- if (j >= n_pids)
- pids[m++] = pids[i];
+ for (j = 0, i = 1; i < n_pids; i++) {
+ if (pids[i] == pids[j])
+ continue;
+ pids[++j] = pids[i];
}
}
- n_pids = m;
- pid_width = ilog10(biggest);
-
- /* And sort */
- qsort(pids, n_pids, sizeof(pid_t), compare);
+ n_pids = j + 1;
+ pid_width = DECIMAL_STR_WIDTH(pids[j]);
- if(flags & OUTPUT_FULL_WIDTH)
+ if
(flags & OUTPUT_FULL_WIDTH)
n_columns = 0;
else {
if (n_columns > pid_width+2)
n_columns = 0;
else {
if (n_columns > pid_width+2)
@@
-85,19
+66,16
@@
static void show_pid_array(int pids[], unsigned n_pids, const char *prefix, unsi
n_columns = 20;
}
for (i = 0; i < n_pids; i++) {
n_columns = 20;
}
for (i = 0; i < n_pids; i++) {
- char *t = NULL;
+
_cleanup_free_
char *t = NULL;
get_process_cmdline(pids[i], n_columns, true, &t);
get_process_cmdline(pids[i], n_columns, true, &t);
- printf("%s%s%*lu %s\n",
- prefix,
- draw_special_char(extra ? DRAW_TRIANGULAR_BULLET :
- ((more || i < n_pids-1) ? DRAW_TREE_BRANCH : DRAW_TREE_RIGHT)),
- pid_width,
- (unsigned long) pids[i],
- strna(t));
+ if (extra)
+ printf("%s%s ", prefix, draw_special_char(DRAW_TRIANGULAR_BULLET));
+ else
+ printf("%s%s", prefix, draw_special_char(((more || i < n_pids-1) ? DRAW_TREE_BRANCH : DRAW_TREE_RIGHT)));
-
free(t
);
+
printf("%*"PID_PRI" %s\n", pid_width, pids[i], strna(t)
);
}
}
}
}
@@
-107,7
+85,7
@@
static int show_cgroup_one_by_path(const char *path, const char *prefix, unsigne
_cleanup_fclose_ FILE *f = NULL;
size_t n = 0, n_allocated = 0;
_cleanup_free_ pid_t *pids = NULL;
_cleanup_fclose_ FILE *f = NULL;
size_t n = 0, n_allocated = 0;
_cleanup_free_ pid_t *pids = NULL;
- char *p = NULL;
+
_cleanup_free_
char *p = NULL;
pid_t pid;
int r;
pid_t pid;
int r;
@@
-115,13
+93,8
@@
static int show_cgroup_one_by_path(const char *path, const char *prefix, unsigne
if (r < 0)
return r;
if (r < 0)
return r;
- fn = strappend(p, "/cgroup.procs");
- free(p);
- if (!fn)
- return -ENOMEM;
-
+ fn = strjoina(p, "/cgroup.procs");
f = fopen(fn, "re");
f = fopen(fn, "re");
- free(fn);
if (!f)
return -errno;
if (!f)
return -errno;
@@
-130,17
+103,8
@@
static int show_cgroup_one_by_path(const char *path, const char *prefix, unsigne
if (!kernel_threads && is_kernel_thread(pid) > 0)
continue;
if (!kernel_threads && is_kernel_thread(pid) > 0)
continue;
- if (n >= n_allocated) {
- pid_t *npids;
-
- n_allocated = MAX(16U, n*2U);
-
- npids = realloc(pids, sizeof(pid_t) * n_allocated);
- if (!npids)
- return -ENOMEM;
-
- pids = npids;
- }
+ if (!GREEDY_REALLOC(pids, n_allocated, n + 1))
+ return -ENOMEM;
assert(n < n_allocated);
pids[n++] = pid;
assert(n < n_allocated);
pids[n++] = pid;
@@
-149,8
+113,7
@@
static int show_cgroup_one_by_path(const char *path, const char *prefix, unsigne
if (r < 0)
return r;
if (r < 0)
return r;
- if (n > 0)
- show_pid_array(pids, n, prefix, n_columns, false, more, kernel_threads, flags);
+ show_pid_array(pids, n, prefix, n_columns, false, more, kernel_threads, flags);
return 0;
}
return 0;
}
@@
-196,10
+159,10
@@
int show_cgroup_by_path(const char *path, const char *prefix, unsigned n_columns
if (last) {
printf("%s%s%s\n", prefix, draw_special_char(DRAW_TREE_BRANCH),
if (last) {
printf("%s%s%s\n", prefix, draw_special_char(DRAW_TREE_BRANCH),
-
path_get_file_
name(last));
+
base
name(last));
if (!p1) {
if (!p1) {
- p1 = strappend(prefix, draw_special_char(DRAW_TREE_VERT));
+ p1 = strappend(prefix, draw_special_char(DRAW_TREE_VERT
ICAL
));
if (!p1)
return -ENOMEM;
}
if (!p1)
return -ENOMEM;
}
@@
-220,7
+183,7
@@
int show_cgroup_by_path(const char *path, const char *prefix, unsigned n_columns
if (last) {
printf("%s%s%s\n", prefix, draw_special_char(DRAW_TREE_RIGHT),
if (last) {
printf("%s%s%s\n", prefix, draw_special_char(DRAW_TREE_RIGHT),
-
path_get_file_
name(last));
+
base
name(last));
if (!p2) {
p2 = strappend(prefix, " ");
if (!p2) {
p2 = strappend(prefix, " ");
@@
-248,11
+211,10
@@
int show_cgroup(const char *controller, const char *path, const char *prefix, un
}
static int show_extra_pids(const char *controller, const char *path, const char *prefix, unsigned n_columns, const pid_t pids[], unsigned n_pids, OutputFlags flags) {
}
static int show_extra_pids(const char *controller, const char *path, const char *prefix, unsigned n_columns, const pid_t pids[], unsigned n_pids, OutputFlags flags) {
-
pid_t _cleanup_free_
*copy = NULL;
+
_cleanup_free_ pid_t
*copy = NULL;
unsigned i, j;
int r;
unsigned i, j;
int r;
- assert(controller);
assert(path);
if (n_pids <= 0)
assert(path);
if (n_pids <= 0)
@@
-268,7
+230,7
@@
static int show_extra_pids(const char *controller, const char *path, const char
return -ENOMEM;
for (i = 0, j = 0; i < n_pids; i++) {
return -ENOMEM;
for (i = 0, j = 0; i < n_pids; i++) {
-
char _cleanup_free_
*k = NULL;
+
_cleanup_free_ char
*k = NULL;
r = cg_pid_get_path(controller, pids[i], &k);
if (r < 0)
r = cg_pid_get_path(controller, pids[i], &k);
if (r < 0)