diff --git a/src/bin/system/machine.h b/src/bin/system/machine.h index 863b7d9..c8340c3 100644 --- a/src/bin/system/machine.h +++ b/src/bin/system/machine.h @@ -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 diff --git a/src/bin/system/machine/memory.bogox b/src/bin/system/machine/memory.bogox index 2ab5c3b..d9983c9 100644 --- a/src/bin/system/machine/memory.bogox +++ b/src/bin/system/machine/memory.bogox @@ -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; diff --git a/src/bin/ui/ui_memory.c b/src/bin/ui/ui_memory.c index fa4740a..e74474d 100644 --- a/src/bin/ui/ui_memory.c +++ b/src/bin/ui/ui_memory.c @@ -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, _("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, _("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, _("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, _("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, _("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);