From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: "Carlo Marcelo Arenas Belón" <carenas@gmail.com>
Cc: gitster@pobox.com, git@vger.kernel.org
Subject: Re: [PATCH 2/3] grep: make PCRE2 aware of custom allocator
Date: Thu, 8 Aug 2019 15:56:54 +0200 (CEST) [thread overview]
Message-ID: <nycvar.QRO.7.76.6.1908081556020.46@tvgsbejvaqbjf.bet> (raw)
In-Reply-To: <20190806085014.47776-3-carenas@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 5228 bytes --]
Hi Carlo,
On Tue, 6 Aug 2019, Carlo Marcelo Arenas Belón wrote:
> Most of the code stolen from[1] to easy on comparison and including
> the deficiency of setting the global context even for patterns that
> won't need it.
>
> Ideally, the call from grep_init could be moved to a place where it
> could be set without needing a lock and at least with this approach
> we have a place to clear it (which is obviously missing more callers,
> but at least shows how it will look for the grep subcommand)
>
> I had also dropped most other users of the global context in a failed
> attempt to make the change smaller, but also to keep the current
> behaviour so that we could see the effect of enabling NED for PCRE2
> more clearly.
>
> Sadly, that will likely require a Windows box, as NED (at least our
> version) is horribly broken in macOS (maybe it wasn't 64 bit clean)
> and in Linux builds, but I can't reproduce your crasher and it is
> most likely slower than the system malloc.
>
> [1] https://public-inbox.org/git/pull.306.git.gitgitgadget@gmail.com/
>
> Suggested-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Actually not so much suggested by me, as your patch still causes
crashes (mine didn't):
https://dev.azure.com/gitgitgadget/git/_build/results?buildId=13935&view=ms.vss-test-web.build-test-results-tab
Ciao,
Dscho
> ---
> builtin/grep.c | 1 +
> grep.c | 31 +++++++++++++++++++++++++++++--
> grep.h | 1 +
> 3 files changed, 31 insertions(+), 2 deletions(-)
>
> diff --git a/builtin/grep.c b/builtin/grep.c
> index 560051784e..e49c20df60 100644
> --- a/builtin/grep.c
> +++ b/builtin/grep.c
> @@ -1145,5 +1145,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
> run_pager(&opt, prefix);
> clear_pathspec(&pathspec);
> free_grep_patterns(&opt);
> + grep_destroy();
> return !hit;
> }
> diff --git a/grep.c b/grep.c
> index 0154998695..e748a6d68c 100644
> --- a/grep.c
> +++ b/grep.c
> @@ -16,6 +16,20 @@ static int grep_source_is_binary(struct grep_source *gs,
>
> static struct grep_opt grep_defaults;
>
> +#ifdef USE_LIBPCRE2
> +static pcre2_general_context *pcre2_global_context;
> +
> +static void *pcre2_malloc(PCRE2_SIZE size, void *memory_data)
> +{
> + return malloc(size);
> +}
> +
> +static void pcre2_free(void *pointer, void *memory_data)
> +{
> + return free(pointer);
> +}
> +#endif
> +
> static const char *color_grep_slots[] = {
> [GREP_COLOR_CONTEXT] = "context",
> [GREP_COLOR_FILENAME] = "filename",
> @@ -153,6 +167,7 @@ int grep_config(const char *var, const char *value, void *cb)
> *
> * If using PCRE make sure that the library is configured
> * to use the right allocator (ex: NED)
> + * if any object is created it should be cleaned up in grep_destroy()
> */
> void grep_init(struct grep_opt *opt, struct repository *repo, const char *prefix)
> {
> @@ -164,6 +179,10 @@ void grep_init(struct grep_opt *opt, struct repository *repo, const char *prefix
> pcre_malloc = malloc;
> pcre_free = free;
> #endif
> +#ifdef USE_LIBPCRE2
> + pcre2_global_context = pcre2_general_context_create(pcre2_malloc,
> + pcre2_free, NULL);
> +#endif
> #endif
>
> memset(opt, 0, sizeof(*opt));
> @@ -188,6 +207,13 @@ void grep_init(struct grep_opt *opt, struct repository *repo, const char *prefix
> color_set(opt->colors[i], def->colors[i]);
> }
>
> +void grep_destroy(void)
> +{
> +#ifdef USE_LIBPCRE2
> + pcre2_general_context_free(pcre2_global_context);
> +#endif
> +}
> +
> static void grep_set_pattern_type_option(enum grep_pattern_type pattern_type, struct grep_opt *opt)
> {
> /*
> @@ -509,7 +535,7 @@ static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt
>
> if (opt->ignore_case) {
> if (has_non_ascii(p->pattern)) {
> - character_tables = pcre2_maketables(NULL);
> + character_tables = pcre2_maketables(pcre2_global_context);
> p->pcre2_compile_context = pcre2_compile_context_create(NULL);
> pcre2_set_character_tables(p->pcre2_compile_context, character_tables);
> }
> @@ -560,7 +586,8 @@ static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt
> return;
> }
>
> - p->pcre2_jit_stack = pcre2_jit_stack_create(1, 1024 * 1024, NULL);
> + p->pcre2_jit_stack = pcre2_jit_stack_create(1, 1024 * 1024,
> + pcre2_global_context);
> if (!p->pcre2_jit_stack)
> die("Couldn't allocate PCRE2 JIT stack");
> p->pcre2_match_context = pcre2_match_context_create(NULL);
> diff --git a/grep.h b/grep.h
> index 1875880f37..526c2db9ef 100644
> --- a/grep.h
> +++ b/grep.h
> @@ -189,6 +189,7 @@ struct grep_opt {
> void init_grep_defaults(struct repository *);
> int grep_config(const char *var, const char *value, void *);
> void grep_init(struct grep_opt *, struct repository *repo, const char *prefix);
> +void grep_destroy(void);
> void grep_commit_pattern_type(enum grep_pattern_type, struct grep_opt *opt);
>
> void append_grep_pat(struct grep_opt *opt, const char *pat, size_t patlen, const char *origin, int no, enum grep_pat_token t);
> --
> 2.23.0.rc1
>
>
next prev parent reply other threads:[~2019-08-08 13:57 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-05 11:51 [PATCH 0/1] Fix a problem with PCRE2 and nedmalloc, found via Azure Pipelines Johannes Schindelin via GitGitGadget
2019-08-05 11:51 ` [PATCH 1/1] pcre2: allow overriding the system allocator Johannes Schindelin via GitGitGadget
2019-08-05 16:19 ` Carlo Arenas
2019-08-05 16:27 ` Carlo Arenas
2019-08-05 19:32 ` Johannes Schindelin
2019-08-05 19:26 ` Johannes Schindelin
2019-08-05 21:53 ` Junio C Hamano
2019-08-06 6:24 ` Carlo Arenas
2019-08-06 8:50 ` [PATCH 0/3] grep: no leaks (WIP) Carlo Marcelo Arenas Belón
2019-08-06 8:50 ` [PATCH 1/3] grep: make PCRE1 aware of custom allocator Carlo Marcelo Arenas Belón
2019-08-08 13:54 ` Johannes Schindelin
2019-08-08 15:19 ` Carlo Arenas
2019-08-06 8:50 ` [PATCH 2/3] grep: make PCRE2 " Carlo Marcelo Arenas Belón
2019-08-08 13:56 ` Johannes Schindelin [this message]
2019-08-08 14:32 ` Carlo Arenas
2019-08-06 8:50 ` [PATCH 3/3] grep: avoid leak of chartables in PCRE2 Carlo Marcelo Arenas Belón
2019-08-06 16:36 ` [RFC PATCH v3 0/3] grep: no leaks or crashes (windows testing needed) Carlo Marcelo Arenas Belón
2019-08-06 16:36 ` [RFC PATCH v3 1/3] grep: make PCRE1 aware of custom allocator Carlo Marcelo Arenas Belón
2019-08-06 16:36 ` [RFC PATCH v3 2/3] grep: make PCRE2 " Carlo Marcelo Arenas Belón
2019-08-07 5:38 ` René Scharfe
2019-08-07 9:49 ` Carlo Arenas
2019-08-07 13:02 ` René Scharfe
2019-08-07 13:08 ` [PATCH 1/2] nedmalloc: do assignments only after the declaration section René Scharfe
2019-08-07 13:09 ` [PATCH 2/2] nedmalloc: avoid compiler warning about unused value René Scharfe
2019-08-08 2:35 ` [RFC PATCH v3 2/3] grep: make PCRE2 aware of custom allocator Carlo Arenas
2019-08-08 7:07 ` René Scharfe
2019-08-08 12:38 ` Carlo Arenas
2019-08-08 14:29 ` René Scharfe
2019-08-08 20:18 ` Johannes Schindelin
2019-08-07 18:15 ` Junio C Hamano
2019-08-06 16:36 ` [RFC PATCH v3 3/3] grep: avoid leak of chartables in PCRE2 Carlo Marcelo Arenas Belón
2019-08-06 16:48 ` [RFC PATCH v3 0/3] grep: no leaks or crashes (windows testing needed) Junio C Hamano
2019-08-07 21:39 ` [RFC PATCH v4 " Carlo Marcelo Arenas Belón
2019-08-07 21:39 ` [RFC PATCH v4 1/3] grep: make PCRE1 aware of custom allocator Carlo Marcelo Arenas Belón
2019-08-07 21:39 ` [RFC PATCH v4 2/3] grep: make PCRE2 " Carlo Marcelo Arenas Belón
2019-08-07 22:28 ` Junio C Hamano
2019-08-07 21:39 ` [RFC PATCH v4 3/3] grep: avoid leak of chartables in PCRE2 Carlo Marcelo Arenas Belón
2019-08-09 3:02 ` [RFC PATCH v5 0/3] grep: almost no more leaks, hopefully no crashes Carlo Marcelo Arenas Belón
2019-08-09 3:02 ` [RFC PATCH v5 1/3] grep: make PCRE1 aware of custom allocator Carlo Marcelo Arenas Belón
2019-08-09 3:02 ` [RFC PATCH v5 2/3] grep: make PCRE2 " Carlo Marcelo Arenas Belón
2019-08-27 9:07 ` Johannes Schindelin
2019-08-27 11:51 ` Carlo Arenas
2019-10-03 5:02 ` Junio C Hamano
2019-10-03 8:08 ` Johannes Schindelin
2019-10-03 11:17 ` Carlo Arenas
2019-10-03 18:23 ` Johannes Schindelin
2019-10-03 22:57 ` Junio C Hamano
2019-08-09 3:02 ` [RFC PATCH v5 3/3] grep: avoid leak of chartables in PCRE2 Carlo Marcelo Arenas Belón
2019-08-09 11:24 ` [RFC PATCH v5 0/3] grep: almost no more leaks, hopefully no crashes Carlo Arenas
2019-08-09 17:01 ` René Scharfe
2019-08-09 17:46 ` Junio C Hamano
2019-08-09 21:26 ` Johannes Schindelin
2019-08-10 3:03 ` [PATCH] SQUASH Carlo Marcelo Arenas Belón
2019-08-10 7:57 ` René Scharfe
2019-08-10 8:42 ` Carlo Arenas
2019-08-10 19:47 ` René Scharfe
2019-08-12 7:35 ` Carlo Arenas
2019-08-12 12:14 ` René Scharfe
2019-08-12 12:28 ` Carlo Arenas
2019-08-10 13:57 ` Johannes Schindelin
2019-08-10 3:05 ` [RFC PATCH v5 0/3] grep: almost no more leaks, hopefully no crashes Carlo Arenas
2019-08-10 7:56 ` René Scharfe
2019-08-10 12:40 ` Carlo Arenas
2019-08-10 21:16 ` René Scharfe
2019-08-08 20:21 ` [RFC PATCH v3 0/3] grep: no leaks or crashes (windows testing needed) Johannes Schindelin
2019-08-09 6:52 ` Carlo Arenas
2019-08-09 21:13 ` Johannes Schindelin
-- strict thread matches above, loose matches on Subject: below --
2019-10-16 12:06 [PATCH 0/3] Revive 'pcre2-chartables-leakfix' Johannes Schindelin via GitGitGadget
2019-10-16 12:06 ` [PATCH 2/3] grep: make PCRE2 aware of custom allocator Carlo Marcelo Arenas Belón via GitGitGadget
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=nycvar.QRO.7.76.6.1908081556020.46@tvgsbejvaqbjf.bet \
--to=johannes.schindelin@gmx.de \
--cc=carenas@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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).