Skip to content

Commit

Permalink
grep: enable threading for context line printing
Browse files Browse the repository at this point in the history
If context lines are to be printed, grep separates them with hunk marks
("--\n").  These marks are printed between matches from different files,
too.  They are not printed before the first file, though.

Threading was disabled when context line printing was enabled because
avoiding to print the mark before the first line was an unsolved
synchronisation problem.  This patch separates the code for printing
hunk marks for the threaded and the unthreaded case, allowing threading
to be turned on together with the common -ABC options.

->show_hunk_mark, which controls printing of hunk marks between files in
show_line(), is now set in grep_buffer_1(), but only if some results
have already been printed and threading is disabled.  The threaded case
is handled in work_done().

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
René Scharfe authored and Junio C Hamano committed Mar 15, 2010
1 parent c24138b commit 431d6e7
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 14 deletions.
15 changes: 13 additions & 2 deletions builtin/grep.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@ static pthread_cond_t cond_write;
/* Signalled when we are finished with everything. */
static pthread_cond_t cond_result;

static int print_hunk_marks_between_files;
static int printed_something;

static void add_work(enum work_type type, char *name, void *id)
{
grep_lock();
Expand Down Expand Up @@ -159,7 +162,12 @@ static void work_done(struct work_item *w)
for(; todo[todo_done].done && todo_done != todo_start;
todo_done = (todo_done+1) % ARRAY_SIZE(todo)) {
w = &todo[todo_done];
write_or_die(1, w->out.buf, w->out.len);
if (w->out.len) {
if (print_hunk_marks_between_files && printed_something)
write_or_die(1, "--\n", 3);
write_or_die(1, w->out.buf, w->out.len);
printed_something = 1;
}
free(w->name);
free(w->identifier);
}
Expand Down Expand Up @@ -926,8 +934,11 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
if (online_cpus() == 1 || !grep_threads_ok(&opt))
use_threads = 0;

if (use_threads)
if (use_threads) {
if (opt.pre_context || opt.post_context)
print_hunk_marks_between_files = 1;
start_threads(&opt);
}
#else
use_threads = 0;
#endif
Expand Down
17 changes: 5 additions & 12 deletions grep.c
Original file line number Diff line number Diff line change
Expand Up @@ -551,8 +551,6 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
if (opt->last_shown == 0) {
if (opt->show_hunk_mark)
opt->output(opt, "--\n", 3);
else
opt->show_hunk_mark = 1;
} else if (lno > opt->last_shown + 1)
opt->output(opt, "--\n", 3);
}
Expand Down Expand Up @@ -750,14 +748,6 @@ int grep_threads_ok(const struct grep_opt *opt)
!opt->name_only)
return 0;

/* If we are showing hunk marks, we should not do it for the
* first match. The synchronization problem we get for this
* constraint is not yet solved, so we disable threading in
* this case.
*/
if (opt->pre_context || opt->post_context)
return 0;

return 1;
}

Expand All @@ -779,11 +769,14 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name,
enum grep_context ctx = GREP_CONTEXT_HEAD;
xdemitconf_t xecfg;

opt->last_shown = 0;

if (!opt->output)
opt->output = std_output;

if (opt->last_shown && (opt->pre_context || opt->post_context) &&
opt->output == std_output)
opt->show_hunk_mark = 1;
opt->last_shown = 0;

if (buffer_is_binary(buf, size)) {
switch (opt->binary) {
case GREP_BINARY_DEFAULT:
Expand Down

0 comments on commit 431d6e7

Please sign in to comment.