From: "René Scharfe" <rene.scharfe@lsrfire.ath.cx>
To: Git Mailing List <git@vger.kernel.org>
Cc: Junio C Hamano <gitster@pobox.com>, Fredrik Kuivinen <frekui@gmail.com>
Subject: [RFC][PATCH] grep: enable threading for context line printing
Date: Sun, 14 Mar 2010 19:18:12 +0100 [thread overview]
Message-ID: <4B9D2864.9090808@lsrfire.ath.cx> (raw)
This patch makes work_done() in builtin/grep.c print hunk marks between
files if threading is used, while show_line() in grep.c still does the
same in the other case. The latter is controlled by the struct grep_opt
member show_hunk_mark: 0 means show_line() prints no hunk marks between
files, 1 means it prints them before the next file with matches and 2
means it prints them before matches from the current file.
Having two places for this is a bit ugly but it enables parallel grep
for the common -ABC options. Locking should be fine in add_work().
Comments?
René
---
builtin/grep.c | 17 ++++++++++++++++-
grep.c | 14 +++-----------
2 files changed, 19 insertions(+), 12 deletions(-)
diff --git a/builtin/grep.c b/builtin/grep.c
index 40b9a93..8d58bb9 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -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();
@@ -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);
}
@@ -932,6 +940,13 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
use_threads = 0;
#endif
+ if (opt.pre_context || opt.post_context) {
+ if (use_threads)
+ print_hunk_marks_between_files = 1;
+ else
+ opt.show_hunk_mark = 1;
+ }
+
compile_grep_patterns(&opt);
/* Check revs and then paths */
diff --git a/grep.c b/grep.c
index 90a063a..251c70c 100644
--- a/grep.c
+++ b/grep.c
@@ -549,10 +549,10 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
sign_str[0] = sign;
if (opt->pre_context || opt->post_context) {
if (opt->last_shown == 0) {
- if (opt->show_hunk_mark)
+ if (opt->show_hunk_mark == 2)
opt->output(opt, "--\n", 3);
- else
- opt->show_hunk_mark = 1;
+ else if (opt->show_hunk_mark == 1)
+ opt->show_hunk_mark = 2;
} else if (lno > opt->last_shown + 1)
opt->output(opt, "--\n", 3);
}
@@ -750,14 +750,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;
}
next reply other threads:[~2010-03-14 18:18 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-14 18:18 René Scharfe [this message]
2010-03-14 20:03 ` [RFC][PATCH] grep: enable threading for context line printing Fredrik Kuivinen
2010-03-15 16:21 ` René Scharfe
2010-03-15 17:14 ` Junio C Hamano
2010-03-20 11:21 ` Fredrik Kuivinen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B9D2864.9090808@lsrfire.ath.cx \
--to=rene.scharfe@lsrfire.ath.cx \
--cc=frekui@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).