Don't cache loaded rules files This needlessly occupies memory for the lifetime of the library, and does not make a noticeable difference otherwise. This rules file won't be loaded more than once in most cases anyway, so just load it again when it happens. Signed-off-by: Ran Benita <ran234@gmail.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
diff --git a/src/xkbcomp/xkbcomp.c b/src/xkbcomp/xkbcomp.c
index 4298e60..e079d60 100644
--- a/src/xkbcomp/xkbcomp.c
+++ b/src/xkbcomp/xkbcomp.c
@@ -77,36 +77,23 @@ XkbComponentsFromRules(const char *rules, const XkbRF_VarDefsPtr defs)
{
FILE *rulesFile = NULL;
char *rulesPath = NULL;
- static XkbRF_RulesPtr loaded = NULL;
- static char *cached_name = NULL;
+ XkbRF_RulesPtr loaded = NULL;
struct xkb_component_names * names = NULL;
- if (!cached_name || strcmp(rules, cached_name) != 0) {
- if (loaded)
- XkbcRF_Free(loaded);
- loaded = NULL;
- free(cached_name);
- cached_name = NULL;
+ rulesFile = XkbFindFileInPath(rules, XkmRulesFile, &rulesPath);
+ if (!rulesFile) {
+ ERROR("could not find \"%s\" rules in XKB path\n", rules);
+ return NULL;
}
- if (!loaded) {
- rulesFile = XkbFindFileInPath(rules, XkmRulesFile, &rulesPath);
- if (!rulesFile) {
- ERROR("could not find \"%s\" rules in XKB path\n", rules);
- goto out;
- }
-
- if (!(loaded = _XkbTypedCalloc(1, XkbRF_RulesRec))) {
- ERROR("failed to allocate XKB rules\n");
- goto unwind_file;
- }
-
- if (!XkbcRF_LoadRules(rulesFile, loaded)) {
- ERROR("failed to load XKB rules \"%s\"\n", rulesPath);
- goto unwind_file;
- }
+ if (!(loaded = _XkbTypedCalloc(1, XkbRF_RulesRec))) {
+ ERROR("failed to allocate XKB rules\n");
+ goto unwind_file;
+ }
- cached_name = strdup(rules);
+ if (!XkbcRF_LoadRules(rulesFile, loaded)) {
+ ERROR("failed to load XKB rules \"%s\"\n", rulesPath);
+ goto unwind_file;
}
if (!(names = _XkbTypedCalloc(1, struct xkb_component_names))) {
@@ -127,10 +114,10 @@ XkbComponentsFromRules(const char *rules, const XkbRF_VarDefsPtr defs)
}
unwind_file:
+ XkbcRF_Free(loaded);
if (rulesFile)
fclose(rulesFile);
free(rulesPath);
-out:
return names;
}