47 |
(1) Call \fBpcre_study()\fP with the PCRE_STUDY_JIT_COMPILE option for |
(1) Call \fBpcre_study()\fP with the PCRE_STUDY_JIT_COMPILE option for |
48 |
each compiled pattern, and pass the resulting \fBpcre_extra\fP block to |
each compiled pattern, and pass the resulting \fBpcre_extra\fP block to |
49 |
\fBpcre_exec()\fP. |
\fBpcre_exec()\fP. |
50 |
|
.sp |
51 |
(2) Use \fBpcre_free_study()\fP to free the \fBpcre_extra\fP block when it is |
(2) Use \fBpcre_free_study()\fP to free the \fBpcre_extra\fP block when it is |
52 |
no longer needed instead of just freeing it yourself. This |
no longer needed instead of just freeing it yourself. This |
53 |
ensures that any JIT data is also freed. |
ensures that any JIT data is also freed. |
54 |
.sp |
.sp |
55 |
In some circumstances you may need to call additional functions. These are |
In some circumstances you may need to call additional functions. These are |
149 |
managing blocks of memory for use as JIT stacks. |
managing blocks of memory for use as JIT stacks. |
150 |
.P |
.P |
151 |
The \fBpcre_jit_stack_alloc()\fP function creates a JIT stack. Its arguments |
The \fBpcre_jit_stack_alloc()\fP function creates a JIT stack. Its arguments |
152 |
are a starting size and a maximum size, and it returns an opaque value |
are a starting size and a maximum size, and it returns a pointer to an opaque |
153 |
of type \fBpcre_jit_stack\fP that represents a JIT stack, or NULL if there is |
structure of type \fBpcre_jit_stack\fP, or NULL if there is an error. The |
154 |
an error. The \fBpcre_jit_stack_free()\fP function can be used to free a stack |
\fBpcre_jit_stack_free()\fP function can be used to free a stack that is no |
155 |
that is no longer needed. (For the technically minded: the address space is |
longer needed. (For the technically minded: the address space is allocated by |
156 |
allocated by mmap or VirtualAlloc.) |
mmap or VirtualAlloc.) |
157 |
.P |
.P |
158 |
JIT uses far less memory for recursion than the interpretive code, |
JIT uses far less memory for recursion than the interpretive code, |
159 |
and a maximum stack size of 512K to 1M should be more than enough for any |
and a maximum stack size of 512K to 1M should be more than enough for any |
160 |
pattern. |
pattern. |
161 |
.P |
.P |
197 |
.sp |
.sp |
198 |
During thread initalization |
During thread initalization |
199 |
thread_local_var = pcre_jit_stack_alloc(...) |
thread_local_var = pcre_jit_stack_alloc(...) |
200 |
|
.sp |
201 |
During thread exit |
During thread exit |
202 |
pcre_jit_stack_free(thread_local_var) |
pcre_jit_stack_free(thread_local_var) |
203 |
|
.sp |
204 |
Use a one-line callback function |
Use a one-line callback function |
205 |
return thread_local_var |
return thread_local_var |
206 |
.sp |
.sp |
214 |
.rs |
.rs |
215 |
.sp |
.sp |
216 |
This is a single-threaded example that specifies a JIT stack without using a |
This is a single-threaded example that specifies a JIT stack without using a |
217 |
callback. |
callback. |
218 |
.sp |
.sp |
219 |
int rc; |
int rc; |
220 |
int ovector[30]; |
int ovector[30]; |
232 |
/* Check results */ |
/* Check results */ |
233 |
pcre_free(re); |
pcre_free(re); |
234 |
pcre_free_study(extra); |
pcre_free_study(extra); |
235 |
|
pcre_jit_stack_free(jit_stack); |
236 |
.sp |
.sp |
237 |
. |
. |
238 |
. |
. |