grep/pcre2: move back to thread-only PCREv2 structures
Change the setup of the "pcre2_general_context" to happen per-thread in compile_pcre2_pattern() instead of in grep_init(). This change brings it in line with how the rest of the pcre2_* members in the grep_pat structure are set up. As noted in the preceding commit the approach513f2b0bbd(grep: make PCRE2 aware of custom allocator, 2019-10-16) took to allocate the pcre2_general_context seems to have been initially based on a misunderstanding of how PCREv2 memory allocation works. The approach of creating a global context in grep_init() is just added complexity for almost zero gain. On my system it's 24 bytes saved per-thread. For comparison PCREv2 will then go on to allocate at least a kilobyte for its own thread-local state. As noted in6d423dd542(grep: don't redundantly compile throwaway patterns under threading, 2017-05-25) the grep code is intentionally not trying to micro-optimize allocations by e.g. sharing some PCREv2 structures globally, while making others thread-local. So let's remove this special case and make all of them thread-local again for simplicity. With this change we could move the pcre2_{malloc,free} functions around to live closer to their current use. I'm not doing that here to keep this change small, that cleanup will be done in a follow-up commit. See also the discussion in94da9193a6(grep: add support for PCRE v2, 2017-06-01) about thread safety, and Johannes's comments[1] to the effect that we should be doing what this patch is doing. 1. https://lore.kernel.org/git/nycvar.QRO.7.76.6.1908052120302.46@tvgsbejvaqbjf.bet/ Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
8d12851342
commit
cbe81e653f
3
grep.h
3
grep.h
@ -14,6 +14,7 @@
|
||||
typedef int pcre2_code;
|
||||
typedef int pcre2_match_data;
|
||||
typedef int pcre2_compile_context;
|
||||
typedef int pcre2_general_context;
|
||||
#endif
|
||||
#ifndef PCRE2_MATCH_INVALID_UTF
|
||||
/* PCRE2_MATCH_* dummy also with !USE_LIBPCRE2, for test-pcre2-config.c */
|
||||
@ -75,6 +76,7 @@ struct grep_pat {
|
||||
pcre2_code *pcre2_pattern;
|
||||
pcre2_match_data *pcre2_match_data;
|
||||
pcre2_compile_context *pcre2_compile_context;
|
||||
pcre2_general_context *pcre2_general_context;
|
||||
const uint8_t *pcre2_tables;
|
||||
uint32_t pcre2_jit_on;
|
||||
unsigned fixed:1;
|
||||
@ -167,7 +169,6 @@ struct grep_opt {
|
||||
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user