diff options
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/computer.c | 19 | ||||
| -rw-r--r-- | modules/devices/dmi_memory.c | 61 | 
2 files changed, 79 insertions, 1 deletions
| diff --git a/modules/computer.c b/modules/computer.c index b3c01ce0..bf2ad16e 100644 --- a/modules/computer.c +++ b/modules/computer.c @@ -825,6 +825,22 @@ gchar *get_memory_total(void)      return moreinfo_lookup ("DEV:MemTotal");  } +gchar *memory_devices_get_system_memory_str(); /* in dmi_memory.c */ +gchar *memory_devices_get_system_memory_types_str(); +gchar *get_memory_desc(void) +{ +    gchar *mem = memory_devices_get_system_memory_str(); +    if (mem) { +        gchar *types = memory_devices_get_system_memory_types_str(); +        gchar *ret = g_strdup_printf("%s\n%s", mem, types); +        g_free(mem); +        g_free(types); +        return ret; +    } +    scan_memory_usage(FALSE); +    return moreinfo_lookup ("DEV:MemTotal"); +} +  ShellModuleMethod *hi_exported_methods(void)  {      static ShellModuleMethod m[] = { @@ -835,6 +851,7 @@ ShellModuleMethod *hi_exported_methods(void)          {"getAudioCards", get_audio_cards},          {"getKernelModuleDescription", get_kernel_module_description},          {"getMemoryTotal", get_memory_total}, +        {"getMemoryDesc", get_memory_desc},          {NULL}      }; @@ -878,7 +895,7 @@ gchar *hi_module_get_summary(void)                      "Method=devices::getProcessorNameAndDesc\n"                      "[%s]\n"                      "Icon=memory.png\n" -                    "Method=computer::getMemoryTotal\n" +                    "Method=computer::getMemoryDesc\n"                      "[%s]\n"                      "Icon=module.png\n"                      "Method=devices::getMotherboard\n" diff --git a/modules/devices/dmi_memory.c b/modules/devices/dmi_memory.c index 1bdf07ce..8cb0395d 100644 --- a/modules/devices/dmi_memory.c +++ b/modules/devices/dmi_memory.c @@ -54,6 +54,7 @@ const char *problem_marker() {  typedef struct {      unsigned long array_handle; +    gboolean is_main_memory;      gchar *locator;      gchar *use;      gchar *ecc; @@ -68,12 +69,16 @@ dmi_mem_array *dmi_mem_array_new(unsigned long h) {      dmi_mem_array *s = g_new0(dmi_mem_array, 1);      s->array_handle = h;      s->use = dmidecode_match("Use", &dta, &h); +    if (SEQ(s->use, "System Memory")) +        s->is_main_memory = TRUE;      s->ecc = dmidecode_match("Error Correction Type", &dta, &h);      s->locator = dmidecode_match("Location", &dta, &h);      if (SEQ(s->locator, mobo_location)) {          g_free(s->locator);          s->locator = g_strdup(mobo_shorter); +        s->is_main_memory = TRUE;      } +      gchar *array_max_size = dmidecode_match("Maximum Capacity", &dta, &h);      if (array_max_size) {          long int v = 0; @@ -137,6 +142,9 @@ typedef struct {      GSList *spd;      long int spd_size_MiB;      int spd_ram_types; /* bits using enum RamType */ + +    int system_memory_ram_types; /* bits using enum RamType */ +    long int system_memory_MiB;  } dmi_mem;  gboolean null_if_empty(gchar **str) { @@ -365,6 +373,22 @@ dmi_mem *dmi_mem_new() {          }      } +    /* Look for arrays with "System Memory" use, +     * or Mainboard as locator */ +    for(l = m->arrays; l; l = l->next) { +        dmi_mem_array *a = (dmi_mem_array*)l->data; +        if (a->is_main_memory) { +            m->system_memory_MiB += a->size_MiB_present; +            m->system_memory_ram_types |= a->ram_types; +        } +    } + +    /* If no arrays, then try the SPD total */ +    if (!m->system_memory_MiB) { +        m->system_memory_MiB = m->spd_size_MiB; +        m->system_memory_ram_types |= m->spd_ram_types; +    } +      return m;  } @@ -678,6 +702,43 @@ gchar *memory_devices_get_info() {      return ret;  } +gchar *memory_devices_get_system_memory_types_str() { +    gchar *ret = NULL, *types_str = NULL; +    int i, rtypes; + +    dmi_mem *lmem = dmi_mem_new(); +    rtypes = lmem->system_memory_ram_types; +    dmi_mem_free(lmem); + +    for(i = 1; i < N_RAM_TYPES; i++) { +        int bit = 1 << (i-1); +        if (rtypes & bit) +            types_str = appf(types_str, "%s", GET_RAM_TYPE_STR(i)); +    } +    ret = g_strdup(UNKIFNULL2(types_str)); +    g_free(types_str); +    return ret; +} + +long int memory_devices_get_system_memory_MiB() { +    dmi_mem *mem = dmi_mem_new(); +    long int ret = mem->system_memory_MiB; +    dmi_mem_free(mem); +    return ret; +} + +gchar *memory_devices_get_system_memory_str() { +    gchar *ret = NULL; +    long int m = memory_devices_get_system_memory_MiB(); +    if (m) { +        if (m > 1024 && (m % 1024 == 0) ) +            ret = g_strdup_printf("%ld %s", m/1024, _("GiB")); +        else +            ret = g_strdup_printf("%ld %s", m, _("MiB")); +    } +    return ret; +} +  static gchar *note_state = NULL;  gboolean memory_devices_hinote(const char **msg) { | 
