top: code shrink, -26 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
87496aa081
commit
d94332f2b6
60
procps/top.c
60
procps/top.c
@ -103,11 +103,11 @@ struct globals {
|
|||||||
}; //FIX_ALIASING; - large code growth
|
}; //FIX_ALIASING; - large code growth
|
||||||
enum { LINE_BUF_SIZE = COMMON_BUFSIZE - offsetof(struct globals, line_buf) };
|
enum { LINE_BUF_SIZE = COMMON_BUFSIZE - offsetof(struct globals, line_buf) };
|
||||||
#define G (*(struct globals*)&bb_common_bufsiz1)
|
#define G (*(struct globals*)&bb_common_bufsiz1)
|
||||||
#define INIT_G() do { \
|
struct BUG_bad_size {
|
||||||
struct G_sizecheck { \
|
char BUG_G_too_big[sizeof(G) <= COMMON_BUFSIZE ? 1 : -1];
|
||||||
char G_sizecheck[sizeof(G) > COMMON_BUFSIZE ? -1 : 1]; \
|
char BUG_line_buf_too_small[LINE_BUF_SIZE > 80 ? 1 : -1];
|
||||||
}; \
|
};
|
||||||
} while (0)
|
#define INIT_G() do { } while (0)
|
||||||
#define top (G.top )
|
#define top (G.top )
|
||||||
#define ntop (G.ntop )
|
#define ntop (G.ntop )
|
||||||
#define sort_field (G.sort_field )
|
#define sort_field (G.sort_field )
|
||||||
@ -705,7 +705,7 @@ static void display_topmem_header(int scr_width, int *lines_rem_p)
|
|||||||
MWRITE, ANON, MAP, SLAB,
|
MWRITE, ANON, MAP, SLAB,
|
||||||
NUM_FIELDS
|
NUM_FIELDS
|
||||||
};
|
};
|
||||||
static const char match[NUM_FIELDS][11] = {
|
static const char match[NUM_FIELDS][12] = {
|
||||||
"\x09" "MemTotal:", // TOTAL
|
"\x09" "MemTotal:", // TOTAL
|
||||||
"\x08" "MemFree:", // MFREE
|
"\x08" "MemFree:", // MFREE
|
||||||
"\x08" "Buffers:", // BUF
|
"\x08" "Buffers:", // BUF
|
||||||
@ -718,52 +718,46 @@ static void display_topmem_header(int scr_width, int *lines_rem_p)
|
|||||||
"\x07" "Mapped:", // MAP
|
"\x07" "Mapped:", // MAP
|
||||||
"\x05" "Slab:", // SLAB
|
"\x05" "Slab:", // SLAB
|
||||||
};
|
};
|
||||||
//TODO? Note that fields always appear in the above order.
|
char meminfo_buf[4 * 1024];
|
||||||
//Thus, as each new line read from /proc/meminfo, we can compare it *once*
|
const char *Z[NUM_FIELDS];
|
||||||
//with match[last_matched+1], instead of looping thru all match[i]'s.
|
|
||||||
//If it matches, memorize its data and last_matched++ (and if == NUM_FIELDS,
|
|
||||||
//we're done with reading /proc/meminfo!); otherwise fgets next line.
|
|
||||||
//The code below is slower, but is robust against a case when /proc/meminfo
|
|
||||||
//gets reordered in the future.
|
|
||||||
char Z[NUM_FIELDS][sizeof(long long)*3];
|
|
||||||
char linebuf[128];
|
|
||||||
unsigned i;
|
unsigned i;
|
||||||
FILE *fp;
|
int sz;
|
||||||
|
|
||||||
memset(&Z, 0, sizeof(Z));
|
|
||||||
for (i = 0; i < NUM_FIELDS; i++)
|
for (i = 0; i < NUM_FIELDS; i++)
|
||||||
Z[i][0] = '?';
|
Z[i] = "?";
|
||||||
|
|
||||||
/* read memory info */
|
/* read memory info */
|
||||||
fp = xfopen_for_read("meminfo");
|
sz = open_read_close("meminfo", meminfo_buf, sizeof(meminfo_buf) - 1);
|
||||||
while (fgets(linebuf, sizeof(linebuf), fp)) {
|
if (sz >= 0) {
|
||||||
|
char *p = meminfo_buf;
|
||||||
|
meminfo_buf[sz] = '\0';
|
||||||
|
/* Note that fields always appear in the match[] order */
|
||||||
for (i = 0; i < NUM_FIELDS; i++) {
|
for (i = 0; i < NUM_FIELDS; i++) {
|
||||||
unsigned sz = (unsigned char)match[i][0];
|
char *found = strstr(p, match[i] + 1);
|
||||||
if (strncmp(linebuf, match[i] + 1, sz) == 0) {
|
if (found) {
|
||||||
/* Cut "NNNN" out of " NNNN kb" */
|
/* Cut "NNNN" out of " NNNN kb" */
|
||||||
char *s = skip_whitespace(linebuf + sz);
|
char *s = skip_whitespace(found + match[i][0]);
|
||||||
skip_non_whitespace(s)[0] = '\0';
|
p = skip_non_whitespace(s);
|
||||||
safe_strncpy(Z[i], s, sizeof(Z[i]));
|
*p++ = '\0';
|
||||||
break;
|
Z[i] = s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
snprintf(linebuf, sizeof(linebuf),
|
snprintf(line_buf, LINE_BUF_SIZE,
|
||||||
"Mem total:%s anon:%s map:%s free:%s",
|
"Mem total:%s anon:%s map:%s free:%s",
|
||||||
Z[TOTAL], Z[ANON], Z[MAP], Z[MFREE]);
|
Z[TOTAL], Z[ANON], Z[MAP], Z[MFREE]);
|
||||||
printf(OPT_BATCH_MODE ? "%.*s\n" : "\033[H\033[J%.*s\n", scr_width, linebuf);
|
printf(OPT_BATCH_MODE ? "%.*s\n" : "\033[H\033[J%.*s\n", scr_width, line_buf);
|
||||||
|
|
||||||
snprintf(linebuf, sizeof(linebuf),
|
snprintf(line_buf, LINE_BUF_SIZE,
|
||||||
" slab:%s buf:%s cache:%s dirty:%s write:%s",
|
" slab:%s buf:%s cache:%s dirty:%s write:%s",
|
||||||
Z[SLAB], Z[BUF], Z[CACHE], Z[DIRTY], Z[MWRITE]);
|
Z[SLAB], Z[BUF], Z[CACHE], Z[DIRTY], Z[MWRITE]);
|
||||||
printf("%.*s\n", scr_width, linebuf);
|
printf("%.*s\n", scr_width, line_buf);
|
||||||
|
|
||||||
snprintf(linebuf, sizeof(linebuf),
|
snprintf(line_buf, LINE_BUF_SIZE,
|
||||||
"Swap total:%s free:%s", // TODO: % used?
|
"Swap total:%s free:%s", // TODO: % used?
|
||||||
Z[SWAPTOTAL], Z[SWAPFREE]);
|
Z[SWAPTOTAL], Z[SWAPFREE]);
|
||||||
printf("%.*s\n", scr_width, linebuf);
|
printf("%.*s\n", scr_width, line_buf);
|
||||||
|
|
||||||
(*lines_rem_p) -= 3;
|
(*lines_rem_p) -= 3;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user