raster pushed a commit to branch master.

http://git.enlightenment.org/apps/evisum.git/commit/?id=a56127a569997b4b9e5f4fff2eca8704bddc5377

commit a56127a569997b4b9e5f4fff2eca8704bddc5377
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Thu Oct 29 12:16:10 2020 +0000

    mem - add memory usage of up to 8 vid cards
    
    max in the code is 8.. will anyone have that many... really?
---
 src/bin/system/machine.h            | 12 ++++++++++
 src/bin/system/machine/memory.bogox | 36 +++++++++++++++++++++++++++--
 src/bin/ui/ui_memory.c              | 46 ++++++++++++++++++++++++++++++++-----
 3 files changed, 86 insertions(+), 8 deletions(-)

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, _("<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);

-- 


Reply via email to