grep: cache userdiff_driver in grep_source
Right now, grep only uses the userdiff_driver for one thing: looking up funcname patterns for "-p" and "-W". As new uses for userdiff drivers are added to the grep code, we want to minimize attribute lookups, which can be expensive. It might seem at first that this would also optimize multiple lookups when the funcname pattern for a file is needed multiple times. However, the compiled funcname pattern is already cached in struct grep_opt's "priv" member, so multiple lookups are already suppressed. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King committed
Feb 2, 2012 at 03:20 UTC
94ad9d9e075d3f7802cf56641ebb342d43fb46e3
2 files changed
+20
-6
grep.c
+16
-6
@@ -841,12 +841,9 @@ static int match_funcname(struct grep_opt *opt, struct grep_source *gs, char *bo
841
{
842
xdemitconf_t *xecfg = opt->priv;
843
if (xecfg && !xecfg->find_func) {
844
- struct userdiff_driver *drv;
845
- grep_attr_lock();
846
- drv = userdiff_find_by_path(gs->name);
847
- grep_attr_unlock();
848
- if (drv && drv->funcname.pattern) {
849
- const struct userdiff_funcname *pe = &drv->funcname;
844
+ grep_source_load_driver(gs);
845
+ if (gs->driver->funcname.pattern) {
846
+ const struct userdiff_funcname *pe = &gs->driver->funcname;
847
xdiff_set_find_func(xecfg, pe->pattern, pe->cflags);
848
} else {
849
xecfg = opt->priv = NULL;
@@ -1237,6 +1234,7 @@ void grep_source_init(struct grep_source *gs, enum grep_source_type type,
1234
gs->name = name ? xstrdup(name) : NULL;
1235
gs->buf = NULL;
1236
gs->size = 0;
1237
+ gs->driver = NULL;
1238
1239
switch (type) {
1240
case GREP_SOURCE_FILE:
@@ -1340,3 +1338,15 @@ int grep_source_load(struct grep_source *gs)
1338
}
1339
die("BUG: invalid grep_source type");
1340
}
1341
+
1342
+void grep_source_load_driver(struct grep_source *gs)
1343
+{
1344
+ if (gs->driver)
1345
+ return;
1346
+
1347
+ grep_attr_lock();
1348
+ gs->driver = userdiff_find_by_path(gs->name);
1349
+ if (!gs->driver)
1350
+ gs->driver = userdiff_find_by_name("default");
1351
+ grep_attr_unlock();
1352
+}
grep.h
+4
@@ -9,6 +9,7 @@ typedef int pcre_extra;
9
#endif
10
#include "kwset.h"
11
#include "thread-utils.h"
12
+#include "userdiff.h"
13
14
enum grep_pat_token {
15
GREP_PATTERN,
@@ -141,6 +142,8 @@ struct grep_source {
142
143
char *buf;
144
unsigned long size;
145
+
146
+ struct userdiff_driver *driver;
147
};
148
149
void grep_source_init(struct grep_source *gs, enum grep_source_type type,
@@ -148,6 +151,7 @@ void grep_source_init(struct grep_source *gs, enum grep_source_type type,
151
int grep_source_load(struct grep_source *gs);
152
void grep_source_clear_data(struct grep_source *gs);
153
void grep_source_clear(struct grep_source *gs);
154
+void grep_source_load_driver(struct grep_source *gs);
155
156
int grep_source(struct grep_opt *opt, struct grep_source *gs);
157