aboutsummaryrefslogtreecommitdiff
path: root/hardinfo2/arch
diff options
context:
space:
mode:
authorLeandro Pereira <leandro@hardinfo.org>2009-04-17 20:47:48 -0300
committerLeandro Pereira <leandro@hardinfo.org>2009-04-17 20:47:48 -0300
commit580ad02ad1202fe34d983cb5c41ca9d65ad2b045 (patch)
tree1a8ed8647e8b7a66cf81dddd3d1b5aa21fc582f8 /hardinfo2/arch
parentff38c6955526377ef92ff7aa96b3c8ecb5fdac05 (diff)
Make CPU flags updatable. Speed up CPU flag meaning lookup.
Diffstat (limited to 'hardinfo2/arch')
-rw-r--r--hardinfo2/arch/linux/x86/processor.h70
1 files changed, 60 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++;
}