Don't scan and parse useless maps
authorRan Benita <ran234@gmail.com>
Sun, 30 Sep 2012 09:55:11 +0000 (11:55 +0200)
committerRan Benita <ran234@gmail.com>
Sun, 30 Sep 2012 13:26:00 +0000 (15:26 +0200)
commit1c880887666f84e08ea1752bb8a5ab2a7bf1d8a0
treedf3c9d6dc0f27b5a0deb0fb26a973924ab610ca7
parent26e685daaeeaa5fc1ac4166b2c066ed6fb4db930
Don't scan and parse useless maps

One physical xkb file may (and usually does) contain multiple maps. For
example, the us symbols file contains a map for every variant.
Currently, when we need a map from a file (specific or default), we
parse the entire file into a list of XkbFile's, find the map we want and
discard the others. This happens for every include statement. This is a lot
of unnecessary work; this commit is a first step at making it better.

What we do now is make yyparse return one map at a time; if we find what
we want, we can stop looking and avoid processing the rest of the file.

This moves some logic from include.c to parser.y (i.e. finding the
correct map, named or default). It also necessarily removes the
CheckDefaultMap check, which warned about a file which contains multiple
default maps. We can live without it.

Some stats with test/rulecomp (under valgrind and the benchmark):

Before:
==2280==   total heap usage: 288,665 allocs, 288,665 frees, 13,121,349 bytes allocated
compiled 1000 keymaps in 10.849487353s

After:
==1070==   total heap usage: 100,197 allocs, 100,197 frees, 9,329,900 bytes allocated
compiled 1000 keymaps in 5.258960549s

Pretty good.

Note: we still do some unnecessary work, by parsing and discarding the
maps before the one we want. However dealing with this is more
complicated (maybe using bison's push-parser and sniffing the token
stream). Probably not worth it.

Signed-off-by: Ran Benita <ran234@gmail.com>
src/xkbcomp/include.c
src/xkbcomp/parser-priv.h
src/xkbcomp/parser.y
src/xkbcomp/scanner.l
src/xkbcomp/xkbcomp-priv.h
src/xkbcomp/xkbcomp.c