Skip to content

Commit 94ad9d9

Browse files
peffgitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent c876d6d commit 94ad9d9

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

grep.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -841,12 +841,9 @@ static int match_funcname(struct grep_opt *opt, struct grep_source *gs, char *bo
841841
{
842842
xdemitconf_t *xecfg = opt->priv;
843843
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;
850847
xdiff_set_find_func(xecfg, pe->pattern, pe->cflags);
851848
} else {
852849
xecfg = opt->priv = NULL;
@@ -1237,6 +1234,7 @@ void grep_source_init(struct grep_source *gs, enum grep_source_type type,
12371234
gs->name = name ? xstrdup(name) : NULL;
12381235
gs->buf = NULL;
12391236
gs->size = 0;
1237+
gs->driver = NULL;
12401238

12411239
switch (type) {
12421240
case GREP_SOURCE_FILE:
@@ -1340,3 +1338,15 @@ int grep_source_load(struct grep_source *gs)
13401338
}
13411339
die("BUG: invalid grep_source type");
13421340
}
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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ typedef int pcre_extra;
99
#endif
1010
#include "kwset.h"
1111
#include "thread-utils.h"
12+
#include "userdiff.h"
1213

1314
enum grep_pat_token {
1415
GREP_PATTERN,
@@ -141,13 +142,16 @@ struct grep_source {
141142

142143
char *buf;
143144
unsigned long size;
145+
146+
struct userdiff_driver *driver;
144147
};
145148

146149
void grep_source_init(struct grep_source *gs, enum grep_source_type type,
147150
const char *name, const void *identifier);
148151
int grep_source_load(struct grep_source *gs);
149152
void grep_source_clear_data(struct grep_source *gs);
150153
void grep_source_clear(struct grep_source *gs);
154+
void grep_source_load_driver(struct grep_source *gs);
151155

152156
int grep_source(struct grep_opt *opt, struct grep_source *gs);
153157

0 commit comments

Comments
 (0)