diff --git a/src/tscore/Regex.cc b/src/tscore/Regex.cc index 22bb2e1c9ec..dc03a9d778d 100644 --- a/src/tscore/Regex.cc +++ b/src/tscore/Regex.cc @@ -29,22 +29,31 @@ #include "tscore/Regex.h" #ifdef PCRE_CONFIG_JIT -static pcre_jit_stack * -get_jit_stack(void *data ATS_UNUSED) +namespace { - thread_local struct JitStack { - JitStack() - { - jit_stack = pcre_jit_stack_alloc(ats_pagesize(), 1024 * 1024); // 1 page min and 1MB max - } - ~JitStack() { pcre_jit_stack_free(jit_stack); } +thread_local pcre_jit_stack *jit_stack; - pcre_jit_stack *jit_stack = nullptr; - } stack; +struct JitStackCleanup { + ~JitStackCleanup() + { + if (jit_stack) { + pcre_jit_stack_free(jit_stack); + } + } +}; +thread_local JitStackCleanup jsc; - return stack.jit_stack; +pcre_jit_stack * +get_jit_stack(void *) +{ + if (!jit_stack) { + jit_stack = pcre_jit_stack_alloc(ats_pagesize(), 1024 * 1024); // 1 page min and 1MB max + } + return jit_stack; } -#endif + +} // end anonymous namespace +#endif // def PCRE_CONFIG_JIT Regex::Regex(Regex &&that) noexcept : regex(that.regex), regex_extra(that.regex_extra) {