git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 3/8] grep: don't redundantly compile throwaway patterns under threading

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Apr 16, 2017, 22:20 UTC
Message-ID
<20170416222102.2320-4-avarab@gmail.com>
In-Reply-To
<20170416222102.2320-1-avarab@gmail.com>

Change the pattern compilation logic under threading so that grep doesn't compile a pattern it never ends up using on the non-threaded code path, only to compile it again N times for N threads which will each use their own copy, ignoring the initially compiled pattern.

This redundant compilation dates back to the initial introduction of the threaded grep in commit 5b594f457a ("Threaded grep", 2010-01-25).

There was never any reason for doing this redundant work other than an oversight in the initial commit. Jeff King suggested on-list in <20170414212325.fefrl3qdjigwyitd@sigill.intra.peff.net> that this might be needed to check the pattern for sanity before threaded execution commences.

That's not the case. The pattern is compiled under threading in start_threads() before any concurrent execution has started by calling pthread_create(), so if the pattern contains an error we still do the right thing. I.e. die with one error before any threaded execution has commenced, instead of e.g. spewing out an error for each N threads, which could be a regression a change like this might inadvertently introduce.

The undocumented --debug mode added in commit 17bf35a3c7 ("grep: teach --debug option to dump the parse tree", 2012-09-13) still works properly with this change. It only emits debugging info during pattern compilation, which is now dumped by the pattern compiled just before the first thread is started.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 builtin/grep.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/builtin/grep.c b/builtin/grep.c
index 3aa7836a04..a3d380551b 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -224,7 +224,8 @@ static void start_threads(struct grep_opt *opt)
 		int err;
 		struct grep_opt *o = grep_opt_dup(opt);
 		o->output = strbuf_out;
-		o->debug = 0;
+		if (i)
+			o->debug = 0;
 		compile_grep_patterns(o);
 		err = pthread_create(&threads[i], NULL, run, o);
 
@@ -1154,8 +1155,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
 	if (!opt.fixed && opt.ignore_case)
 		opt.regflags |= REG_ICASE;
 
-	compile_grep_patterns(&opt);
-
 	/*
 	 * We have to find "--" in a separate pass, because its presence
 	 * influences how we will parse arguments that come before it.
@@ -1230,6 +1229,15 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
 	num_threads = 0;
 #endif
 
+	if (!num_threads)
+		/*
+		 * The compiled patterns on the main path are only
+		 * used when not using threading. Otherwise
+		 * start_threads() below calls compile_grep_patterns()
+		 * for each thread.
+		 */
+		compile_grep_patterns(&opt);
+
 #ifndef NO_PTHREADS
 	if (num_threads) {
 		if (!(opt.name_only || opt.unmatch_name_only || opt.count)
-- 
2.11.0
Previous: Ævar Arnfjörð BjarmasonNext: Ævar Arnfjörð Bjarmason
Message 4 of 9 in “grep threading cleanup & tests”
  1. 0/8 grep threading cleanup & testsÆvar Arnfjörð Bjarmason, Apr 16, 2017
  2. 1/8 grep: assert that threading is enabled when calling grep_{lock,unlock}Ævar Arnfjörð Bjarmason, Apr 16, 2017
  3. 2/8 grep: add tests for --threads=N and grep.threadsÆvar Arnfjörð Bjarmason, Apr 16, 2017
  4. 3/8 grep: don't redundantly compile throwaway patterns under threadingÆvar Arnfjörð Bjarmason, Apr 16, 2017
  5. 4/8 grep: skip pthreads overhead when using one threadÆvar Arnfjörð Bjarmason, Apr 16, 2017
  6. 5/8 tests: add a PTHREADS prerequisiteÆvar Arnfjörð Bjarmason, Apr 16, 2017
  7. 8/8 grep: given --threads with NO_PTHREADS=YesPlease, warnÆvar Arnfjörð Bjarmason, Apr 16, 2017
  8. 7/8 pack-objects: fix buggy warning about threads under NO_PTHREADS=YesPleaseÆvar Arnfjörð Bjarmason, Apr 16, 2017
  9. 6/8 pack-object & index-pack: add test for --threads warning under NO_PTHREADSÆvar Arnfjörð Bjarmason, Apr 16, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.