diff --git a/man/systemd-cgtop.xml b/man/systemd-cgtop.xml index 5beeb586d7..356ec05c77 100644 --- a/man/systemd-cgtop.xml +++ b/man/systemd-cgtop.xml @@ -130,7 +130,7 @@ - Format byte counts (as in memory usage and I/O metrics) + Format byte counts (as in memory usage and I/O metrics) and CPU time with raw numeric values rather than human-readable numbers. diff --git a/src/basic/macro.h b/src/basic/macro.h index e0fe990bef..7aa51fe939 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -281,6 +281,12 @@ static inline size_t GREEDY_ALLOC_ROUND_UP(size_t l) { MAX(_c, z); \ }) +#define MAX4(x, y, z, a) \ + ({ \ + const typeof(x) _d = MAX3(x, y, z); \ + MAX(_d, a); \ + }) + #undef MIN #define MIN(a, b) __MIN(UNIQ, (a), UNIQ, (b)) #define __MIN(aq, a, bq, b) \ diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c index 0b6c2f88ed..0efaf3873e 100644 --- a/src/cgtop/cgtop.c +++ b/src/cgtop/cgtop.c @@ -91,6 +91,15 @@ static Group *group_free(Group *g) { return mfree(g); } + +static const char *maybe_format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy) { + if (arg_raw) { + snprintf(buf, l, USEC_FMT, t); + return buf; + } + return format_timespan(buf, l, t, accuracy); +} + static const char *maybe_format_bytes(char *buf, size_t l, bool is_valid, uint64_t t) { if (!is_valid) return "-"; @@ -586,7 +595,7 @@ static void display(Hashmap *a) { Group **array; signed path_columns; unsigned rows, n = 0, j, maxtcpu = 0, maxtpath = 3; /* 3 for ellipsize() to work properly */ - char buffer[MAX3(21U, FORMAT_BYTES_MAX, FORMAT_TIMESPAN_MAX)]; + char buffer[MAX4(21U, FORMAT_BYTES_MAX, FORMAT_TIMESPAN_MAX, DECIMAL_STR_MAX(usec_t))]; assert(a); @@ -605,7 +614,7 @@ static void display(Hashmap *a) { for (j = 0; j < n; j++) { unsigned cputlen, pathtlen; - format_timespan(buffer, sizeof(buffer), (usec_t) (array[j]->cpu_usage / NSEC_PER_USEC), 0); + maybe_format_timespan(buffer, sizeof(buffer), (usec_t) (array[j]->cpu_usage / NSEC_PER_USEC), 0); cputlen = strlen(buffer); maxtcpu = MAX(maxtcpu, cputlen); @@ -674,7 +683,7 @@ static void display(Hashmap *a) { else fputs(" -", stdout); } else - printf(" %*s", maxtcpu, format_timespan(buffer, sizeof(buffer), (usec_t) (g->cpu_usage / NSEC_PER_USEC), 0)); + printf(" %*s", maxtcpu, maybe_format_timespan(buffer, sizeof(buffer), (usec_t) (g->cpu_usage / NSEC_PER_USEC), 0)); printf(" %8s", maybe_format_bytes(buffer, sizeof(buffer), g->memory_valid, g->memory)); printf(" %8s", maybe_format_bytes(buffer, sizeof(buffer), g->io_valid, g->io_input_bps));