mem - add memory usage of up to 8 vid cards

max in the code is 8.. will anyone have that many... really?
This commit is contained in:
Carsten Haitzler 2020-10-29 12:16:10 +00:00
parent a40c535729
commit a56127a569
3 changed files with 86 additions and 8 deletions

View File

@ -17,6 +17,15 @@ typedef struct
float percent;
} cpu_core_t;
// Will anyone have more than 8 vdrm/video card devices?
#define MEM_VIDEO_CARD_MAX 8
typedef struct
{
uint64_t total;
uint64_t used;
} meminfo_video_t;
typedef struct
{
uint64_t total;
@ -28,6 +37,9 @@ typedef struct
uint64_t swap_used;
uint64_t zfs_arc_used;
uint64_t video_count;
meminfo_video_t video[MEM_VIDEO_CARD_MAX];
} meminfo_t;
typedef struct

View File

@ -25,7 +25,7 @@ _meminfo_parse_line(const char *line)
p++;
tok = strtok(p, " ");
return atol(tok);
return atoll(tok);
}
#endif
@ -38,7 +38,7 @@ system_memory_usage_get(meminfo_t *memory)
FILE *f;
unsigned long swap_free = 0, tmp_free = 0, tmp_slab = 0;
char line[256];
int fields = 0;
int i, fields = 0;
f = fopen("/proc/meminfo", "r");
if (!f) return;
@ -103,6 +103,38 @@ system_memory_usage_get(meminfo_t *memory)
memory->swap_used *= 1024;
fclose(f);
for (i = 0; i < MEM_VIDEO_CARD_MAX; i++)
{
struct stat st;
char buf[256];
// if no more drm devices exist - end of card list
snprintf(buf, sizeof(buf),
"/sys/class/drm/card%i/device", i);
if (stat(buf, &st) != 0) break;
// not all drivers expose this, so video devices with no exposed video
// ram info will appear as 0 sized... much like swap.
snprintf(buf, sizeof(buf),
"/sys/class/drm/card%i/device/mem_info_vram_total", i);
f = fopen(buf, "r");
if (f)
{
if (fgets(buf, sizeof(buf), f))
memory->video[i].total = atoll(buf);
fclose(f);
}
snprintf(buf, sizeof(buf),
"/sys/class/drm/card%i/device/mem_info_vram_used", i);
f = fopen(buf, "r");
if (f)
{
if (fgets(buf, sizeof(buf), f))
memory->video[i].used = atoll(buf);
fclose(f);
}
}
memory->video_count = i;
#elif defined(__FreeBSD__) || defined(__DragonFly__)
unsigned int free = 0, active = 0, inactive = 0, wired = 0;
unsigned int cached = 0, buffered = 0, zfs_arc = 0;

View File

@ -7,6 +7,7 @@ typedef struct {
Evas_Object *buffered;
Evas_Object *shared;
Evas_Object *swap;
Evas_Object *video[MEM_VIDEO_CARD_MAX];
} Widgets;
static Evas_Object *
@ -40,6 +41,7 @@ _memory_update(void *data)
Evas_Object *pb;
double ratio, value;
meminfo_t memory;
int i;
memset(&memory, 0, sizeof(memory));
system_memory_usage_get(&memory);
@ -88,10 +90,15 @@ _memory_update(void *data)
pb = widgets->swap;
if (memory.swap_total)
{
elm_object_disabled_set(pb, EINA_FALSE);
ratio = memory.swap_total / 100.0;
value = memory.swap_used / ratio;
}
else value = 0.0;
else
{
elm_object_disabled_set(pb, EINA_TRUE);
value = 0.0;
}
elm_progressbar_value_set(pb, value / 100);
elm_progressbar_unit_format_set(pb,
@ -99,6 +106,20 @@ _memory_update(void *data)
evisum_size_format(memory.swap_used),
evisum_size_format(memory.swap_total)));
for (i = 0; i < memory.video_count; i++)
{
pb = widgets->video[i];
if (!pb) break;
if (memory.video[i].total) elm_object_disabled_set(pb, EINA_FALSE);
else elm_object_disabled_set(pb, EINA_TRUE);
ratio = memory.video[i].total / 100.0;
value = memory.video[i].used / ratio;
elm_progressbar_value_set(pb, value / 100);
elm_progressbar_unit_format_set(pb,
eina_slstr_printf("%s / %s",
evisum_size_format(memory.video[i].used),
evisum_size_format(memory.video[i].total)));
}
return EINA_TRUE;
}
@ -127,6 +148,8 @@ ui_win_memory_add(Ui *ui)
{
Evas_Object *win, *frame, *pb;
Evas_Object *border, *rect, *label, *table;
int i;
meminfo_t memory;
if (ui->mem.win)
{
@ -137,6 +160,9 @@ ui_win_memory_add(Ui *ui)
Widgets *widgets = calloc(1, sizeof(Widgets));
if (!widgets) return;
memset(&memory, 0, sizeof(memory));
system_memory_usage_get(&memory);
ui->mem.win = win = elm_win_util_standard_add("evisum",
_("Memory Usage"));
evas_object_size_hint_weight_set(win, EXPAND, EXPAND);
@ -156,31 +182,39 @@ ui_win_memory_add(Ui *ui)
elm_table_padding_set(table, 8, 2);
evas_object_show(table);
label = _label_mem(table, _("<color=#fff>Used</>"));
label = _label_mem(table, _("Used"));
widgets->used = pb = _progress_add(table);
elm_table_pack(table, label, 0, 0, 1, 1);
elm_table_pack(table, pb, 1, 0, 1, 1);
label = _label_mem(table, _("<color=#fff>Cached</>"));
label = _label_mem(table, _("Cached"));
widgets->cached = pb = _progress_add(table);
elm_table_pack(table, label, 0, 1, 1, 1);
elm_table_pack(table, pb, 1, 1, 1, 1);
label = _label_mem(table, _("<color=#fff>Buffered</>"));
label = _label_mem(table, _("Buffered"));
widgets->buffered = pb = _progress_add(table);
elm_table_pack(table, label, 0, 2, 1, 1);
elm_table_pack(table, pb, 1, 2, 1, 1);
label = _label_mem(table, _("<color=#fff>Shared</>"));
label = _label_mem(table, _("Shared"));
widgets->shared = pb = _progress_add(table);
elm_table_pack(table, label, 0, 3, 1, 1);
elm_table_pack(table, pb, 1, 3, 1, 1);
label = _label_mem(table, _("<color=#fff>Swapped</>"));
label = _label_mem(table, _("Swapped"));
widgets->swap = pb = _progress_add(frame);
elm_table_pack(table, label, 0, 4, 1, 1);
elm_table_pack(table, pb, 1, 4, 1, 1);
for (i = 0; i < memory.video_count; i++)
{
label = _label_mem(table, _("Video"));
widgets->video[i] = pb = _progress_add(frame);
elm_table_pack(table, label, 0, 5 + i, 1, 1);
elm_table_pack(table, pb, 1, 5 + i, 1, 1);
}
border = elm_frame_add(win);
elm_object_style_set(border, "pad_small");
evas_object_size_hint_weight_set(border, EXPAND, EXPAND);