Skip to content

Commit

Permalink
grep: cache userdiff_driver in grep_source
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Feb 2, 2012
1 parent c876d6d commit 94ad9d9
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 6 deletions.
22 changes: 16 additions & 6 deletions grep.c
Original file line number Diff line number Diff line change
Expand Up @@ -841,12 +841,9 @@ static int match_funcname(struct grep_opt *opt, struct grep_source *gs, char *bo
{
xdemitconf_t *xecfg = opt->priv;
if (xecfg && !xecfg->find_func) {
struct userdiff_driver *drv;
grep_attr_lock();
drv = userdiff_find_by_path(gs->name);
grep_attr_unlock();
if (drv && drv->funcname.pattern) {
const struct userdiff_funcname *pe = &drv->funcname;
grep_source_load_driver(gs);
if (gs->driver->funcname.pattern) {
const struct userdiff_funcname *pe = &gs->driver->funcname;
xdiff_set_find_func(xecfg, pe->pattern, pe->cflags);
} else {
xecfg = opt->priv = NULL;
Expand Down Expand Up @@ -1237,6 +1234,7 @@ void grep_source_init(struct grep_source *gs, enum grep_source_type type,
gs->name = name ? xstrdup(name) : NULL;
gs->buf = NULL;
gs->size = 0;
gs->driver = NULL;

switch (type) {
case GREP_SOURCE_FILE:
Expand Down Expand Up @@ -1340,3 +1338,15 @@ int grep_source_load(struct grep_source *gs)
}
die("BUG: invalid grep_source type");
}

void grep_source_load_driver(struct grep_source *gs)
{
if (gs->driver)
return;

grep_attr_lock();
gs->driver = userdiff_find_by_path(gs->name);
if (!gs->driver)
gs->driver = userdiff_find_by_name("default");
grep_attr_unlock();
}
4 changes: 4 additions & 0 deletions grep.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ typedef int pcre_extra;
#endif
#include "kwset.h"
#include "thread-utils.h"
#include "userdiff.h"

enum grep_pat_token {
GREP_PATTERN,
Expand Down Expand Up @@ -141,13 +142,16 @@ struct grep_source {

char *buf;
unsigned long size;

struct userdiff_driver *driver;
};

void grep_source_init(struct grep_source *gs, enum grep_source_type type,
const char *name, const void *identifier);
int grep_source_load(struct grep_source *gs);
void grep_source_clear_data(struct grep_source *gs);
void grep_source_clear(struct grep_source *gs);
void grep_source_load_driver(struct grep_source *gs);

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

Expand Down

0 comments on commit 94ad9d9

Please sign in to comment.