Don't cache loaded rules files
authorRan Benita <ran234@gmail.com>
Fri, 24 Feb 2012 08:46:41 +0000 (10:46 +0200)
committerRan Benita <ran234@gmail.com>
Sat, 3 Mar 2012 22:02:14 +0000 (00:02 +0200)
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>
src/xkbcomp/xkbcomp.c

index 4298e60..e079d60 100644 (file)
@@ -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;
 }