diff options
| author | Leandro Pereira <leandro@hardinfo.org> | 2009-04-17 20:47:48 -0300 | 
|---|---|---|
| committer | Leandro Pereira <leandro@hardinfo.org> | 2009-04-17 20:47:48 -0300 | 
| commit | 580ad02ad1202fe34d983cb5c41ca9d65ad2b045 (patch) | |
| tree | 1a8ed8647e8b7a66cf81dddd3d1b5aa21fc582f8 /hardinfo2 | |
| parent | ff38c6955526377ef92ff7aa96b3c8ecb5fdac05 (diff) | |
Make CPU flags updatable. Speed up CPU flag meaning lookup.
Diffstat (limited to 'hardinfo2')
| -rw-r--r-- | hardinfo2/arch/linux/x86/processor.h | 70 | ||||
| -rw-r--r-- | hardinfo2/devices.c | 13 | 
2 files changed, 73 insertions, 10 deletions
| diff --git a/hardinfo2/arch/linux/x86/processor.h b/hardinfo2/arch/linux/x86/processor.h index 97fa4555..392288da 100644 --- a/hardinfo2/arch/linux/x86/processor.h +++ b/hardinfo2/arch/linux/x86/processor.h @@ -419,6 +419,54 @@ static struct {  	{ NULL,		NULL						},  }; +GHashTable *cpu_flags = NULL; + +static void cpu_flags_init(void) +{ +    gint i; +    gchar *path; +     +    cpu_flags = g_hash_table_new(g_str_hash, g_str_equal); +     +    path = g_build_filename(g_get_home_dir(), ".hardinfo", "cpuflags.conf", NULL); +    if (!g_file_test(path, G_FILE_TEST_EXISTS)) { +        DEBUG("using internal CPU flags database"); + +        for (i = 0; flag_meaning[i].name != NULL; i++) { +            g_hash_table_insert(cpu_flags, flag_meaning[i].name, +                                flag_meaning[i].meaning); +        } +    } else { +        GKeyFile *flags_file; +         +        DEBUG("using %s as CPU flags database", path); +         +        flags_file = g_key_file_new(); +        if (g_key_file_load_from_file(flags_file, path, 0, NULL)) { +            gchar **flag_keys; +             +            flag_keys = g_key_file_get_keys(flags_file, "flags", +                                            NULL, NULL); +            for (i = 0; flag_keys[i]; i++) { +                gchar *meaning; +                 +                meaning = g_key_file_get_string(flags_file, "flags", +                                                flag_keys[i], NULL); +                                                 +                g_hash_table_insert(cpu_flags, g_strdup(flag_keys[i]), meaning); +                 +                /* can't free meaning */ +            } +             +            g_strfreev(flag_keys); +        }  +         +        g_key_file_free(flags_file); +    } +     +    g_free(path); +} +  gchar *processor_get_capabilities_from_flags(gchar * strflags)  {      /* FIXME: @@ -427,21 +475,23 @@ gchar *processor_get_capabilities_from_flags(gchar * strflags)       */      gchar **flags, **old;      gchar *tmp = NULL; -    gint i, j = 0; +    gint j = 0; +     +    if (!cpu_flags) { +        cpu_flags_init(); +    }      flags = g_strsplit(strflags, " ", 0);      old = flags;      while (flags[j]) { -	gchar *meaning = ""; -	for (i = 0; flag_meaning[i].name != NULL; i++) { -	    if (g_str_equal(flags[j], flag_meaning[i].name)) { -		meaning = flag_meaning[i].meaning; -		break; -	    } -	} - -	tmp = h_strdup_cprintf("%s=%s\n", tmp, flags[j], meaning); +	gchar *meaning = g_hash_table_lookup(cpu_flags, flags[j]); +	 +	if (meaning) { +  	  tmp = h_strdup_cprintf("%s=%s\n", tmp, flags[j], meaning); +        } else { +  	  tmp = h_strdup_cprintf("%s=\n", tmp, flags[j]); +        }  	j++;      } diff --git a/hardinfo2/devices.c b/hardinfo2/devices.c index 35c3ea27..30bfb89e 100644 --- a/hardinfo2/devices.c +++ b/hardinfo2/devices.c @@ -434,6 +434,19 @@ void hi_module_init(void)          sync_manager_add_entry(&se);      } +#if defined(ARCH_i386) || defined(ARCH_x86_64) +    { +      static SyncEntry se = { +        .fancy_name = "Update CPU flag database", +        .name = "RecvCPUFlags", +        .save_to = "cpuflags.conf", +        .get_data = NULL +      }; +       +      sync_manager_add_entry(&se); +    } +#endif	/* defined(ARCH_i386) || defined(ARCH_x86_64) */ +      moreinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);      __init_memory_labels();      __init_cups(); | 
