netstar pushed a commit to branch master.

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

commit 5db5da933c97cb88a85e9a4ec23d3f3260a40fea
Author: Alastair Poole <nets...@gmail.com>
Date:   Wed Oct 14 14:02:50 2020 +0100

    cpu: rudimentary order by topology...
---
 src/bin/system/machine.h         |  3 +++
 src/bin/system/machine/cpu.bogox | 51 +++++++++++++++++++++++++++++++++++++++-
 src/bin/ui/ui_cpu.c              | 21 ++++++++++++-----
 3 files changed, 68 insertions(+), 7 deletions(-)

diff --git a/src/bin/system/machine.h b/src/bin/system/machine.h
index fe088a4..4b708aa 100644
--- a/src/bin/system/machine.h
+++ b/src/bin/system/machine.h
@@ -113,6 +113,9 @@ system_cpu_temperature_min_max_get(int *min, int *max);
 int
 system_cpu_frequency_min_max_get(int *min, int *max);
 
+void
+system_cpu_topology_get(int *ids, int ncpus);
+
 void
 system_memory_usage_get(meminfo_t *memory);
 
diff --git a/src/bin/system/machine/cpu.bogox b/src/bin/system/machine/cpu.bogox
index 8fcc805..5fbd131 100644
--- a/src/bin/system/machine/cpu.bogox
+++ b/src/bin/system/machine/cpu.bogox
@@ -279,7 +279,6 @@ system_cpu_usage_get(int *ncpu)
    return system_cpu_usage_delayed_get(ncpu, 1000000);
 }
 
-
 static int  _cpu_temp_min = 0;
 static int  _cpu_temp_max = 100;
 static char _core_temps[256][512];
@@ -596,3 +595,53 @@ system_cpu_frequency_get(void)
 #endif
    return freq;
 }
+
+#if defined(__linux__)
+
+typedef struct {
+   short id;
+   short core_id;
+} core_top_t;
+
+static int
+_cmp(const void *a, const void *b)
+{
+   core_top_t *aa = (core_top_t *) a;
+   core_top_t *bb = (core_top_t *) b;
+
+   if (aa->core_id == bb->core_id) return 0;
+   else if (aa->core_id < bb->core_id) return -1;
+   else return 1;
+}
+
+#endif
+
+void
+system_cpu_topology_get(int *ids, int ncpu)
+{
+#if defined(__linux__)
+   char buf[4096];
+   core_top_t *cores = malloc(ncpu * sizeof(core_top_t));
+
+   for (int i = 0; i < ncpu; i++)
+     {
+        cores[i].id = i;
+        cores[i].core_id = i;
+        snprintf(buf, sizeof(buf), 
"/sys/devices/system/cpu/cpu%i/topology/core_id", i);
+        char *b = file_contents(buf);
+        if (b)
+          {
+             cores[i].core_id = atoi(b);
+             free(b);
+          }
+     }
+
+   qsort(cores, ncpu, sizeof(core_top_t), _cmp);
+
+   for (int i = 0; i < ncpu; i++)
+     {
+        ids[i] = cores[i].id;
+     }
+   free(cores);
+#endif
+}
diff --git a/src/bin/ui/ui_cpu.c b/src/bin/ui/ui_cpu.c
index eaadb6b..e683157 100644
--- a/src/bin/ui/ui_cpu.c
+++ b/src/bin/ui/ui_cpu.c
@@ -17,6 +17,8 @@ typedef struct {
 
    int             cpu_count;
 
+   int            *cpu_order;
+
    Eina_Bool       show_cpufreq;
    // Have cpu scaling
    Eina_Bool       cpu_freq;
@@ -154,13 +156,14 @@ _core_times_main_cb(void *data, Ecore_Thread *thread)
              for (int n = 0; n < ncpu; n++)
                {
                   // Copy our core state data to mainloop
+                  int id = ad->cpu_order[n];
                   Core *core = &(cores_out[n]);
-                  core->id = n;
-                  core->percent = cores[n]->percent;
+                  core->id = id;
+                  core->percent = cores[id]->percent;
                   if (ad->cpu_freq)
-                    core->freq = system_cpu_n_frequency_get(n);
+                    core->freq = system_cpu_n_frequency_get(id);
                   if (ad->cpu_temp)
-                    core->temp = system_cpu_n_temperature_get(n);
+                    core->temp = system_cpu_n_temperature_get(id);
                   free(cores[n]);
                }
              ecore_thread_feedback(thread, cores_out);
@@ -273,7 +276,7 @@ _explain(Animate *ad, Core *cores)
    for (int i = 0; i < ad->cpu_count; i++)
      {
         Core *core = &(cores[i]);
-        lb = eina_list_nth(ad->explainers, core->id);
+        lb = eina_list_nth(ad->explainers, i);
         if (!ad->confused)
           evas_object_hide(lb);
         else
@@ -326,6 +329,7 @@ _win_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object 
*obj EINA_UNUSED, void
    ecore_thread_wait(ui->cpu.thread, 0.5);
    eina_list_free(ad->explainers);
    ad->explainers = NULL;
+   free(ad->cpu_order);
    free(ad);
    ui->cpu.win = NULL;
 }
@@ -399,6 +403,11 @@ _graph(Ui *ui, Evas_Object *parent)
    if ((system_cpu_n_temperature_get(0)) != -1)
      ad->cpu_temp = EINA_TRUE;
 
+   ad->cpu_order = malloc((ad->cpu_count) * sizeof(int));
+   for (i = 0; i < ad->cpu_count; i++)
+     ad->cpu_order[i] = i;
+   system_cpu_topology_get(ad->cpu_order, ad->cpu_count);
+
    // init colormaps from a small # of points
    _color_init(cpu_colormap_in, COLOR_CPU_NUM, cpu_colormap);
    _color_init(freq_colormap_in, COLOR_FREQ_NUM, freq_colormap);
@@ -458,7 +467,7 @@ _graph(Ui *ui, Evas_Object *parent)
         elm_table_pack(tbl, rec, 2, i, 1, 1);
 
         lb = elm_label_add(parent);
-        snprintf(buf, sizeof(buf), "<b><color=#fff>%i</></>", i);
+        snprintf(buf, sizeof(buf), "<b><color=#fff>%i</></>", 
ad->cpu_order[i]);
         elm_object_text_set(lb, buf);
         evas_object_size_hint_align_set(lb, 1.0, 0.5);
         evas_object_size_hint_weight_set(lb, 0.0, EXPAND);

-- 


Reply via email to