top: Differentiate general memory from memory used for tmpfs
This commit is contained in:
parent
cce8885060
commit
727fc27eab
68
apps/top.c
68
apps/top.c
@ -405,23 +405,57 @@ static void get_cpu_info(int cpus[]) {
|
|||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Obtain information on how much system memory is
|
||||||
|
* being used for tmpfs blocks.
|
||||||
|
*/
|
||||||
|
static void get_tmpfs_info(size_t * size) {
|
||||||
|
FILE * f = fopen("/proc/tmpfs", "r");
|
||||||
|
if (!f) return;
|
||||||
|
|
||||||
|
char buf[1024] = {0};
|
||||||
|
fread(buf,1,1024,f);
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
/* Should probably be looking for UsedBlocks: and advancing from there... */
|
||||||
|
char *b = strstr(buf, ":");
|
||||||
|
if (!b) return;
|
||||||
|
b += 2;
|
||||||
|
|
||||||
|
*size = strtoul(b,NULL,10) * 4; /* Expressed in pages, so * 4 for kilobytes */
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fill_colors[] = {
|
||||||
|
1, 3, 4, 5, 6
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Display a progress-bar-style usage meter.
|
* @brief Display a progress-bar-style usage meter.
|
||||||
*
|
*
|
||||||
* @p title Label to apply to the meter, shown on left.
|
* @p title Label to apply to the meter, shown on left.
|
||||||
* @p label Label to show inside of the meter, show on the right.
|
* @p label Label to show inside of the meter, show on the right.
|
||||||
* @p width Available width to display the meter in, including title and frame.
|
* @p width Available width to display the meter in, including title and frame.
|
||||||
* @p filled Value of the meter.
|
* @p count Number of values to display.
|
||||||
|
* @p filled Values to stack in the meter.
|
||||||
* @p maximum Maximum value of the meter.
|
* @p maximum Maximum value of the meter.
|
||||||
*/
|
*/
|
||||||
static void print_meter(const char * title, const char * label, int width, int filled, int maximum) {
|
static void print_meter(const char * title, const char * label, int width, int count, int filled[], int maximum) {
|
||||||
if (filled < 0) filled = 0;
|
|
||||||
if (filled > maximum) filled = maximum;
|
|
||||||
int available = width - strlen(title) - 4;
|
int available = width - strlen(title) - 4;
|
||||||
int fillSlots = filled * available / maximum;
|
int remaining = available;
|
||||||
|
int fillSlots = 0;
|
||||||
|
|
||||||
|
/* Count total fill slots */
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
filled[i] = filled[i] * available / maximum;
|
||||||
|
if (filled[i] < 0) filled[i] = 0;
|
||||||
|
if (filled[i] > remaining) filled[i] = remaining;
|
||||||
|
fillSlots += filled[i];
|
||||||
|
remaining = available - fillSlots;
|
||||||
|
}
|
||||||
|
|
||||||
int emptSlots = available - fillSlots;
|
int emptSlots = available - fillSlots;
|
||||||
|
|
||||||
printf("\033[1m%s [\033[0;91m", title);
|
printf("\033[1m%s [", title);
|
||||||
|
|
||||||
char * fill = malloc(available + 1);
|
char * fill = malloc(available + 1);
|
||||||
size_t j = 0;
|
size_t j = 0;
|
||||||
@ -434,7 +468,11 @@ static void print_meter(const char * title, const char * label, int width, int f
|
|||||||
}
|
}
|
||||||
|
|
||||||
j = 0;
|
j = 0;
|
||||||
for (int i = 0; i < fillSlots; ++i, j++) printf("%c",fill[j]);
|
|
||||||
|
for (int c = 0; c < count; ++c) {
|
||||||
|
printf("\033[0;9%dm", fill_colors[c % (sizeof(fill_colors) / sizeof(int))]);
|
||||||
|
for (int i = 0; i < filled[c]; ++i, j++) printf("%c",fill[j]);
|
||||||
|
}
|
||||||
printf("\033[90m");
|
printf("\033[90m");
|
||||||
for (int i = 0; i < emptSlots; ++i, j++) printf("%c",fill[j]);
|
for (int i = 0; i < emptSlots; ++i, j++) printf("%c",fill[j]);
|
||||||
|
|
||||||
@ -503,6 +541,9 @@ static int do_once(void) {
|
|||||||
int mem_total = 0, mem_used = 0;
|
int mem_total = 0, mem_used = 0;
|
||||||
get_mem_info(&mem_total, &mem_used);
|
get_mem_info(&mem_total, &mem_used);
|
||||||
|
|
||||||
|
size_t mem_tmpfs = 0;
|
||||||
|
get_tmpfs_info(&mem_tmpfs);
|
||||||
|
|
||||||
/* Gather per-CPU usage from /proc/idle */
|
/* Gather per-CPU usage from /proc/idle */
|
||||||
int cpus[32];
|
int cpus[32];
|
||||||
get_cpu_info(cpus);
|
get_cpu_info(cpus);
|
||||||
@ -526,11 +567,14 @@ static int do_once(void) {
|
|||||||
meter_width = w.ws_col;
|
meter_width = w.ws_col;
|
||||||
info_width = 0;
|
info_width = 0;
|
||||||
} else {
|
} else {
|
||||||
|
#define T_T "\033[94m"
|
||||||
|
#define T_C "\033[0;1m"
|
||||||
|
#define T_E "\033[0m"
|
||||||
if (top_rows >= 1) {
|
if (top_rows >= 1) {
|
||||||
info_rows = 1;
|
info_rows = 1;
|
||||||
char tmp[256] = {0};
|
char tmp[256] = {0};
|
||||||
gethostname(tmp, 255);
|
gethostname(tmp, 255);
|
||||||
snprintf(info_row[0], 99, "\033[94mHostname: \033[0;1m%.*s\033[0m", info_width - 10, tmp);
|
snprintf(info_row[0], 99, T_T "Hostname: " T_C "%.*s" T_E, info_width - 10, tmp);
|
||||||
}
|
}
|
||||||
if (top_rows >= 2) {
|
if (top_rows >= 2) {
|
||||||
info_rows = 2;
|
info_rows = 2;
|
||||||
@ -541,11 +585,11 @@ static int do_once(void) {
|
|||||||
gettimeofday(&now, NULL);
|
gettimeofday(&now, NULL);
|
||||||
timeinfo = localtime((time_t *)&now.tv_sec);
|
timeinfo = localtime((time_t *)&now.tv_sec);
|
||||||
strftime(tmp,255,format,timeinfo);
|
strftime(tmp,255,format,timeinfo);
|
||||||
snprintf(info_row[1], 99, "\033[94mTime: \033[0;1m%.*s\033[0m", info_width - 6, tmp);
|
snprintf(info_row[1], 99, T_T "Time: " T_C "%.*s" T_E, info_width - 6, tmp);
|
||||||
}
|
}
|
||||||
if (top_rows >= 3) {
|
if (top_rows >= 3) {
|
||||||
info_rows = 3;
|
info_rows = 3;
|
||||||
snprintf(info_row[2], 99, "\033[94mTasks: \033[0;1m%lu\033[0m", count);
|
snprintf(info_row[2], 99, T_T "Tasks: " T_C "%lu" T_E, count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -557,7 +601,7 @@ static int do_once(void) {
|
|||||||
char name[20], usage[30];
|
char name[20], usage[30];
|
||||||
sprintf(name, "%3d", cpu + 1);
|
sprintf(name, "%3d", cpu + 1);
|
||||||
sprintf(usage, "%d.%01d%%", cpus[cpu] / 10, cpus[cpu] % 10);
|
sprintf(usage, "%d.%01d%%", cpus[cpu] / 10, cpus[cpu] % 10);
|
||||||
print_meter(name, usage, left_side ? meter_width : info_width, cpus[cpu], 1000);
|
print_meter(name, usage, left_side ? meter_width : info_width, 1, (int[]){cpus[cpu]}, 1000);
|
||||||
|
|
||||||
if (current_row < info_rows) {
|
if (current_row < info_rows) {
|
||||||
printf("%s\033[K\n", info_row[current_row]);
|
printf("%s\033[K\n", info_row[current_row]);
|
||||||
@ -577,7 +621,7 @@ static int do_once(void) {
|
|||||||
/* Display memory usage widget */
|
/* Display memory usage widget */
|
||||||
char memUsed[30];
|
char memUsed[30];
|
||||||
sprintf(memUsed, "%dM/%dM", mem_used / 1024, mem_total / 1024);
|
sprintf(memUsed, "%dM/%dM", mem_used / 1024, mem_total / 1024);
|
||||||
print_meter("Mem", memUsed, left_side ? meter_width : info_width, mem_used, mem_total);
|
print_meter("Mem", memUsed, left_side ? meter_width : info_width, 2, (int[]){mem_used-mem_tmpfs,mem_tmpfs}, mem_total);
|
||||||
if (left_side && current_row < info_rows) {
|
if (left_side && current_row < info_rows) {
|
||||||
printf("%s", info_row[current_row]);
|
printf("%s", info_row[current_row]);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user