summaryrefslogtreecommitdiffstats
path: root/hid.c
diff options
context:
space:
mode:
authorThierry Vignaud <tv@mageia.org>2012-12-12 10:12:16 +0000
committerThierry Vignaud <tv@mageia.org>2012-12-12 10:12:16 +0000
commitee5d3e43c585a4386ded58d76fac2ef0985d96b5 (patch)
treea6f59fa82673a7982238405197ec652de498c529 /hid.c
parent52c9d46227efeb02415c202866d38b4fc458d572 (diff)
downloadldetect-ee5d3e43c585a4386ded58d76fac2ef0985d96b5.tar
ldetect-ee5d3e43c585a4386ded58d76fac2ef0985d96b5.tar.gz
ldetect-ee5d3e43c585a4386ded58d76fac2ef0985d96b5.tar.bz2
ldetect-ee5d3e43c585a4386ded58d76fac2ef0985d96b5.tar.xz
ldetect-ee5d3e43c585a4386ded58d76fac2ef0985d96b5.zip
make ldetect 3x faster (and even faster on machines quite quite a lot
of devices such as servers) (modalias_init) split it out of modalias_resolve_module() (modalias_cleanup) move libkmod related cleanups here (hid_probe,find_modules_through_aliases) only initialize libkmod once (which reduces user time from 0.26 to 0.08s & elapsed time from 0.28 to 0.9s) (backported from trunk)
Diffstat (limited to 'hid.c')
-rw-r--r--hid.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/hid.c b/hid.c
index 5671a66..b9b5c9d 100644
--- a/hid.c
+++ b/hid.c
@@ -4,6 +4,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <libkmod.h>
#include "libsysfs.h"
#include "libldetect.h"
@@ -79,7 +80,7 @@ static void add_entry(struct hid_entries *entry_list, char *name, char *module)
}
}
-static void parse_device(struct hid_entries *entries, const char *dev)
+static void parse_device(struct kmod_ctx *ctx, struct hid_entries *entries, const char *dev)
{
char keyfile[SYSFS_PATH_MAX];
char *modalias;
@@ -111,12 +112,11 @@ static void parse_device(struct hid_entries *entries, const char *dev)
else
device_name = strdup("HID Device");
- modname = modalias_resolve_module(modalias);
+ modname = modalias_resolve_module(ctx, modalias);
free(modalias);
DEBUG("%s: module name is [%s]\n", HID_BUS_NAME, modname);
if (modname != NULL)
add_entry(entries, device_name, modname);
- modalias_cleanup();
}
@@ -125,6 +125,7 @@ struct hid_entries hid_probe(void)
DIR *dir;
struct dirent *dent;
struct hid_entries entry_list = {NULL, 0};
+ struct kmod_ctx *ctx = modalias_init();
dir = opendir(sysfs_hid_path);
if (dir == NULL)
@@ -134,10 +135,11 @@ struct hid_entries hid_probe(void)
if (dent->d_name[0] == '.')
continue;
DEBUG("%s: device found %s\n", HID_BUS_NAME, dent->d_name);
- parse_device(&entry_list, dent->d_name);
+ parse_device(ctx, &entry_list, dent->d_name);
}
end_probe:
+ modalias_cleanup(ctx);
if (dir)
closedir(dir);