/[pcre]/code/trunk/doc/html/pcrejit.html
ViewVC logotype

Diff of /code/trunk/doc/html/pcrejit.html

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 784 by ph10, Mon Dec 5 12:33:44 2011 UTC revision 975 by ph10, Sat Jun 2 11:03:06 2012 UTC
# Line 14  man page, in case the conversion went wr Line 14  man page, in case the conversion went wr
14  <br>  <br>
15  <ul>  <ul>
16  <li><a name="TOC1" href="#SEC1">PCRE JUST-IN-TIME COMPILER SUPPORT</a>  <li><a name="TOC1" href="#SEC1">PCRE JUST-IN-TIME COMPILER SUPPORT</a>
17  <li><a name="TOC2" href="#SEC2">AVAILABILITY OF JIT SUPPORT</a>  <li><a name="TOC2" href="#SEC2">8-BIT and 16-BIT SUPPORT</a>
18  <li><a name="TOC3" href="#SEC3">SIMPLE USE OF JIT</a>  <li><a name="TOC3" href="#SEC3">AVAILABILITY OF JIT SUPPORT</a>
19  <li><a name="TOC4" href="#SEC4">UNSUPPORTED OPTIONS AND PATTERN ITEMS</a>  <li><a name="TOC4" href="#SEC4">SIMPLE USE OF JIT</a>
20  <li><a name="TOC5" href="#SEC5">RETURN VALUES FROM JIT EXECUTION</a>  <li><a name="TOC5" href="#SEC5">UNSUPPORTED OPTIONS AND PATTERN ITEMS</a>
21  <li><a name="TOC6" href="#SEC6">SAVING AND RESTORING COMPILED PATTERNS</a>  <li><a name="TOC6" href="#SEC6">RETURN VALUES FROM JIT EXECUTION</a>
22  <li><a name="TOC7" href="#SEC7">CONTROLLING THE JIT STACK</a>  <li><a name="TOC7" href="#SEC7">SAVING AND RESTORING COMPILED PATTERNS</a>
23  <li><a name="TOC8" href="#SEC8">JIT STACK FAQ</a>  <li><a name="TOC8" href="#SEC8">CONTROLLING THE JIT STACK</a>
24  <li><a name="TOC9" href="#SEC9">EXAMPLE CODE</a>  <li><a name="TOC9" href="#SEC9">JIT STACK FAQ</a>
25  <li><a name="TOC10" href="#SEC10">SEE ALSO</a>  <li><a name="TOC10" href="#SEC10">EXAMPLE CODE</a>
26  <li><a name="TOC11" href="#SEC11">AUTHOR</a>  <li><a name="TOC11" href="#SEC11">SEE ALSO</a>
27  <li><a name="TOC12" href="#SEC12">REVISION</a>  <li><a name="TOC12" href="#SEC12">AUTHOR</a>
28    <li><a name="TOC13" href="#SEC13">REVISION</a>
29  </ul>  </ul>
30  <br><a name="SEC1" href="#TOC1">PCRE JUST-IN-TIME COMPILER SUPPORT</a><br>  <br><a name="SEC1" href="#TOC1">PCRE JUST-IN-TIME COMPILER SUPPORT</a><br>
31  <P>  <P>
32  Just-in-time compiling is a heavyweight optimization that can greatly speed up  Just-in-time compiling is a heavyweight optimization that can greatly speed up
33  pattern matching. However, it comes at the cost of extra processing before the  pattern matching. However, it comes at the cost of extra processing before the
34  match is performed. Therefore, it is of most benefit when the same pattern is  match is performed. Therefore, it is of most benefit when the same pattern is
35  going to be matched many times. This does not necessarily mean many calls of  going to be matched many times. This does not necessarily mean many calls of a
36  \fPpcre_exec()\fP; if the pattern is not anchored, matching attempts may take  matching function; if the pattern is not anchored, matching attempts may take
37  place many times at various positions in the subject, even for a single call to  place many times at various positions in the subject, even for a single call.
38  <b>pcre_exec()</b>. If the subject string is very long, it may still pay to use  Therefore, if the subject string is very long, it may still pay to use JIT for
39  JIT for one-off matches.  one-off matches.
40    </P>
41    <P>
42    JIT support applies only to the traditional Perl-compatible matching function.
43    It does not apply when the DFA matching function is being used. The code for
44    this support was written by Zoltan Herczeg.
45    </P>
46    <br><a name="SEC2" href="#TOC1">8-BIT and 16-BIT SUPPORT</a><br>
47    <P>
48    JIT support is available for both the 8-bit and 16-bit PCRE libraries. To keep
49    this documentation simple, only the 8-bit interface is described in what
50    follows. If you are using the 16-bit library, substitute the 16-bit functions
51    and 16-bit structures (for example, <i>pcre16_jit_stack</i> instead of
52    <i>pcre_jit_stack</i>).
53  </P>  </P>
54  <P>  <br><a name="SEC3" href="#TOC1">AVAILABILITY OF JIT SUPPORT</a><br>
 JIT support applies only to the traditional matching function,  
 <b>pcre_exec()</b>. It does not apply when <b>pcre_dfa_exec()</b> is being used.  
 The code for this support was written by Zoltan Herczeg.  
 </P>  
 <br><a name="SEC2" href="#TOC1">AVAILABILITY OF JIT SUPPORT</a><br>  
55  <P>  <P>
56  JIT support is an optional feature of PCRE. The "configure" option --enable-jit  JIT support is an optional feature of PCRE. The "configure" option --enable-jit
57  (or equivalent CMake option) must be set when PCRE is built if you want to use  (or equivalent CMake option) must be set when PCRE is built if you want to use
# Line 51  JIT. The support is limited to the follo Line 60  JIT. The support is limited to the follo
60    ARM v5, v7, and Thumb2    ARM v5, v7, and Thumb2
61    Intel x86 32-bit and 64-bit    Intel x86 32-bit and 64-bit
62    MIPS 32-bit    MIPS 32-bit
63    Power PC 32-bit and 64-bit (experimental)    Power PC 32-bit and 64-bit
64  </pre>  </pre>
65  The Power PC support is designated as experimental because it has not been  If --enable-jit is set on an unsupported platform, compilation fails.
 fully tested. If --enable-jit is set on an unsupported platform, compilation  
 fails.  
66  </P>  </P>
67  <P>  <P>
68  A program that is linked with PCRE 8.20 or later can tell if JIT support is  A program that is linked with PCRE 8.20 or later can tell if JIT support is
69  available by calling <b>pcre_config()</b> with the PCRE_CONFIG_JIT option. The  available by calling <b>pcre_config()</b> with the PCRE_CONFIG_JIT option. The
70  result is 1 when JIT is available, and 0 otherwise. However, a simple program  result is 1 when JIT is available, and 0 otherwise. However, a simple program
71  does not need to check this in order to use JIT. The API is implemented in a  does not need to check this in order to use JIT. The API is implemented in a
72  way that falls back to the ordinary PCRE code if JIT is not available.  way that falls back to the interpretive code if JIT is not available.
73  </P>  </P>
74  <P>  <P>
75  If your program may sometimes be linked with versions of PCRE that are older  If your program may sometimes be linked with versions of PCRE that are older
76  than 8.20, but you want to use JIT when it is available, you can test  than 8.20, but you want to use JIT when it is available, you can test
77  the values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such  the values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such
78  as PCRE_CONFIG_JIT, for compile-time control of your code.  as PCRE_CONFIG_JIT, for compile-time control of your code.
79  </P>  </P>
80  <br><a name="SEC3" href="#TOC1">SIMPLE USE OF JIT</a><br>  <br><a name="SEC4" href="#TOC1">SIMPLE USE OF JIT</a><br>
81  <P>  <P>
82  You have to do two things to make use of the JIT support in the simplest way:  You have to do two things to make use of the JIT support in the simplest way:
83  <pre>  <pre>
# Line 79  You have to do two things to make use of Line 86  You have to do two things to make use of
86        <b>pcre_exec()</b>.        <b>pcre_exec()</b>.
87    
88    (2) Use <b>pcre_free_study()</b> to free the <b>pcre_extra</b> block when it is    (2) Use <b>pcre_free_study()</b> to free the <b>pcre_extra</b> block when it is
89        no longer needed instead of just freeing it yourself. This        no longer needed, instead of just freeing it yourself. This
90        ensures that any JIT data is also freed.        ensures that any JIT data is also freed.
91  </pre>  </pre>
92  For a program that may be linked with pre-8.20 versions of PCRE, you can insert  For a program that may be linked with pre-8.20 versions of PCRE, you can insert
# Line 88  For a program that may be linked with pr Line 95  For a program that may be linked with pr
95    #define PCRE_STUDY_JIT_COMPILE 0    #define PCRE_STUDY_JIT_COMPILE 0
96    #endif    #endif
97  </pre>  </pre>
98  so that no option is passed to <b>pcre_study()</b>, and then use something like  so that no option is passed to <b>pcre_study()</b>, and then use something like
99  this to free the study data:  this to free the study data:
100  <pre>  <pre>
101    #ifdef PCRE_CONFIG_JIT    #ifdef PCRE_CONFIG_JIT
# Line 97  this to free the study data: Line 104  this to free the study data:
104        pcre_free(study_ptr);        pcre_free(study_ptr);
105    #endif    #endif
106  </pre>  </pre>
107    PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for complete
108    matches. If you want to run partial matches using the PCRE_PARTIAL_HARD or
109    PCRE_PARTIAL_SOFT options of <b>pcre_exec()</b>, you should set one or both of
110    the following options in addition to, or instead of, PCRE_STUDY_JIT_COMPILE
111    when you call <b>pcre_study()</b>:
112    <pre>
113      PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
114      PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
115    </pre>
116    The JIT compiler generates different optimized code for each of the three
117    modes (normal, soft partial, hard partial). When <b>pcre_exec()</b> is called,
118    the appropriate code is run if it is available. Otherwise, the pattern is
119    matched using interpretive code.
120    </P>
121    <P>
122  In some circumstances you may need to call additional functions. These are  In some circumstances you may need to call additional functions. These are
123  described in the section entitled  described in the section entitled
124  <a href="#stackcontrol">"Controlling the JIT stack"</a>  <a href="#stackcontrol">"Controlling the JIT stack"</a>
125  below.  below.
126  </P>  </P>
127  <P>  <P>
128  If JIT support is not available, PCRE_STUDY_JIT_COMPILE is ignored, and no JIT  If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are ignored, and
129  data is set up. Otherwise, the compiled pattern is passed to the JIT compiler,  no JIT data is created. Otherwise, the compiled pattern is passed to the JIT
130  which turns it into machine code that executes much faster than the normal  compiler, which turns it into machine code that executes much faster than the
131  interpretive code. When <b>pcre_exec()</b> is passed a <b>pcre_extra</b> block  normal interpretive code. When <b>pcre_exec()</b> is passed a <b>pcre_extra</b>
132  containing a pointer to JIT code, it obeys that instead of the normal code. The  block containing a pointer to JIT code of the appropriate mode (normal or
133  result is identical, but the code runs much faster.  hard/soft partial), it obeys that code instead of running the interpreter. The
134    result is identical, but the compiled JIT code runs much faster.
135  </P>  </P>
136  <P>  <P>
137  There are some <b>pcre_exec()</b> options that are not supported for JIT  There are some <b>pcre_exec()</b> options that are not supported for JIT
138  execution. There are also some pattern items that JIT cannot handle. Details  execution. There are also some pattern items that JIT cannot handle. Details
139  are given below. In both cases, execution automatically falls back to the  are given below. In both cases, execution automatically falls back to the
140  interpretive code.  interpretive code. If you want to know whether JIT was actually used for a
141    particular match, you should arrange for a JIT callback function to be set up
142    as described in the section entitled
143    <a href="#stackcontrol">"Controlling the JIT stack"</a>
144    below, even if you do not need to supply a non-default JIT stack. Such a
145    callback function is called whenever JIT code is about to be obeyed. If the
146    execution options are not right for JIT execution, the callback function is not
147    obeyed.
148  </P>  </P>
149  <P>  <P>
150  If the JIT compiler finds an unsupported item, no JIT data is generated. You  If the JIT compiler finds an unsupported item, no JIT data is generated. You
151  can find out if JIT execution is available after studying a pattern by calling  can find out if JIT execution is available after studying a pattern by calling
152  <b>pcre_fullinfo()</b> with the PCRE_INFO_JIT option. A result of 1 means that  <b>pcre_fullinfo()</b> with the PCRE_INFO_JIT option. A result of 1 means that
153  JIT compilation was successful. A result of 0 means that JIT support is not  JIT compilation was successful. A result of 0 means that JIT support is not
154  available, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE, or the  available, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE etc., or
155  JIT compiler was not able to handle the pattern.  the JIT compiler was not able to handle the pattern.
156  </P>  </P>
157  <P>  <P>
158  Once a pattern has been studied, with or without JIT, it can be used as many  Once a pattern has been studied, with or without JIT, it can be used as many
159  times as you like for matching different subject strings.  times as you like for matching different subject strings.
160  </P>  </P>
161  <br><a name="SEC4" href="#TOC1">UNSUPPORTED OPTIONS AND PATTERN ITEMS</a><br>  <br><a name="SEC5" href="#TOC1">UNSUPPORTED OPTIONS AND PATTERN ITEMS</a><br>
162  <P>  <P>
163  The only <b>pcre_exec()</b> options that are supported for JIT execution are  The only <b>pcre_exec()</b> options that are supported for JIT execution are
164  PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, and  PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NOTBOL, PCRE_NOTEOL,
165  PCRE_NOTEMPTY_ATSTART. Note in particular that partial matching is not  PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT.
 supported.  
166  </P>  </P>
167  <P>  <P>
168  The unsupported pattern items are:  The unsupported pattern items are:
169  <pre>  <pre>
170    \C             match a single byte; not supported in UTF-8 mode    \C             match a single byte; not supported in UTF-8 mode
171    (?Cn)          callouts    (?Cn)          callouts
172    (*COMMIT)      )    (*PRUNE)       )
173    (*MARK)        )    (*SKIP)        ) backtracking control verbs
   (*PRUNE)       ) the backtracking control verbs  
   (*SKIP)        )  
174    (*THEN)        )    (*THEN)        )
175  </pre>  </pre>
176  Support for some of these may be added in future.  Support for some of these may be added in future.
177  </P>  </P>
178  <br><a name="SEC5" href="#TOC1">RETURN VALUES FROM JIT EXECUTION</a><br>  <br><a name="SEC6" href="#TOC1">RETURN VALUES FROM JIT EXECUTION</a><br>
179  <P>  <P>
180  When a pattern is matched using JIT execution, the return values are the same  When a pattern is matched using JIT execution, the return values are the same
181  as those given by the interpretive <b>pcre_exec()</b> code, with the addition of  as those given by the interpretive <b>pcre_exec()</b> code, with the addition of
# Line 166  when JIT is not used, but the details of Line 193  when JIT is not used, but the details of
193  same. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT  same. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT
194  execution.  execution.
195  </P>  </P>
196  <br><a name="SEC6" href="#TOC1">SAVING AND RESTORING COMPILED PATTERNS</a><br>  <br><a name="SEC7" href="#TOC1">SAVING AND RESTORING COMPILED PATTERNS</a><br>
197  <P>  <P>
198  The code that is generated by the JIT compiler is architecture-specific, and is  The code that is generated by the JIT compiler is architecture-specific, and is
199  also position dependent. For those reasons it cannot be saved (in a file or  also position dependent. For those reasons it cannot be saved (in a file or
# Line 179  restored pattern, and thereby recreate t Line 206  restored pattern, and thereby recreate t
206  compilation uses significant resources, it is probably not worth doing this;  compilation uses significant resources, it is probably not worth doing this;
207  you might as well recompile the original pattern.  you might as well recompile the original pattern.
208  <a name="stackcontrol"></a></P>  <a name="stackcontrol"></a></P>
209  <br><a name="SEC7" href="#TOC1">CONTROLLING THE JIT STACK</a><br>  <br><a name="SEC8" href="#TOC1">CONTROLLING THE JIT STACK</a><br>
210  <P>  <P>
211  When the compiled JIT code runs, it needs a block of memory to use as a stack.  When the compiled JIT code runs, it needs a block of memory to use as a stack.
212  By default, it uses 32K on the machine stack. However, some large or  By default, it uses 32K on the machine stack. However, some large or
# Line 188  is given when there is not enough stack. Line 215  is given when there is not enough stack.
215  managing blocks of memory for use as JIT stacks. There is further discussion  managing blocks of memory for use as JIT stacks. There is further discussion
216  about the use of JIT stacks in the section entitled  about the use of JIT stacks in the section entitled
217  <a href="#stackcontrol">"JIT stack FAQ"</a>  <a href="#stackcontrol">"JIT stack FAQ"</a>
218  below.  below.
219  </P>  </P>
220  <P>  <P>
221  The <b>pcre_jit_stack_alloc()</b> function creates a JIT stack. Its arguments  The <b>pcre_jit_stack_alloc()</b> function creates a JIT stack. Its arguments
# Line 212  should use. Its arguments are as follows Line 239  should use. Its arguments are as follows
239    void               *data    void               *data
240  </pre>  </pre>
241  The <i>extra</i> argument must be the result of studying a pattern with  The <i>extra</i> argument must be the result of studying a pattern with
242  PCRE_STUDY_JIT_COMPILE. There are three cases for the values of the other two  PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the other
243  options:  two options:
244  <pre>  <pre>
245    (1) If <i>callback</i> is NULL and <i>data</i> is NULL, an internal 32K block    (1) If <i>callback</i> is NULL and <i>data</i> is NULL, an internal 32K block
246        on the machine stack is used.        on the machine stack is used.
# Line 221  options: Line 248  options:
248    (2) If <i>callback</i> is NULL and <i>data</i> is not NULL, <i>data</i> must be    (2) If <i>callback</i> is NULL and <i>data</i> is not NULL, <i>data</i> must be
249        a valid JIT stack, the result of calling <b>pcre_jit_stack_alloc()</b>.        a valid JIT stack, the result of calling <b>pcre_jit_stack_alloc()</b>.
250    
251    (3) If <i>callback</i> not NULL, it must point to a function that is called    (3) If <i>callback</i> is not NULL, it must point to a function that is
252        with <i>data</i> as an argument at the start of matching, in order to        called with <i>data</i> as an argument at the start of matching, in
253        set up a JIT stack. If the result is NULL, the internal 32K stack        order to set up a JIT stack. If the return from the callback
254        is used; otherwise the return value must be a valid JIT stack,        function is NULL, the internal 32K stack is used; otherwise the
255        the result of calling <b>pcre_jit_stack_alloc()</b>.        return value must be a valid JIT stack, the result of calling
256          <b>pcre_jit_stack_alloc()</b>.
257  </pre>  </pre>
258  You may safely assign the same JIT stack to more than one pattern, as long as  A callback function is obeyed whenever JIT code is about to be run; it is not
259  they are all matched sequentially in the same thread. In a multithread  obeyed when <b>pcre_exec()</b> is called with options that are incompatible for
260  application, each thread must use its own JIT stack.  JIT execution. A callback function can therefore be used to determine whether a
261    match operation was executed by JIT or by the interpreter.
262    </P>
263    <P>
264    You may safely use the same JIT stack for more than one pattern (either by
265    assigning directly or by callback), as long as the patterns are all matched
266    sequentially in the same thread. In a multithread application, if you do not
267    specify a JIT stack, or if you assign or pass back NULL from a callback, that
268    is thread-safe, because each thread has its own machine stack. However, if you
269    assign or pass back a non-NULL JIT stack, this must be a different stack for
270    each thread so that the application is thread-safe.
271  </P>  </P>
272  <P>  <P>
273  Strictly speaking, even more is allowed. You can assign the same stack to any  Strictly speaking, even more is allowed. You can assign the same non-NULL stack
274  number of patterns as long as they are not used for matching by multiple  to any number of patterns as long as they are not used for matching by multiple
275  threads at the same time. For example, you can assign the same stack to all  threads at the same time. For example, you can assign the same stack to all
276  compiled patterns, and use a global mutex in the callback to wait until the  compiled patterns, and use a global mutex in the callback to wait until the
277  stack is available for use. However, this is an inefficient solution, and  stack is available for use. However, this is an inefficient solution, and not
278  not recommended.  recommended.
279  </P>  </P>
280  <P>  <P>
281  This is a suggestion for how a typical multithreaded program might operate:  This is a suggestion for how a multithreaded program that needs to set up
282    non-default JIT stacks might operate:
283  <pre>  <pre>
284    During thread initalization    During thread initalization
285      thread_local_var = pcre_jit_stack_alloc(...)      thread_local_var = pcre_jit_stack_alloc(...)
# Line 254  This is a suggestion for how a typical m Line 293  This is a suggestion for how a typical m
293  All the functions described in this section do nothing if JIT is not available,  All the functions described in this section do nothing if JIT is not available,
294  and <b>pcre_assign_jit_stack()</b> does nothing unless the <b>extra</b> argument  and <b>pcre_assign_jit_stack()</b> does nothing unless the <b>extra</b> argument
295  is non-NULL and points to a <b>pcre_extra</b> block that is the result of a  is non-NULL and points to a <b>pcre_extra</b> block that is the result of a
296  successful study with PCRE_STUDY_JIT_COMPILE.  successful study with PCRE_STUDY_JIT_COMPILE etc.
297  <a name="stackfaq"></a></P>  <a name="stackfaq"></a></P>
298  <br><a name="SEC8" href="#TOC1">JIT STACK FAQ</a><br>  <br><a name="SEC9" href="#TOC1">JIT STACK FAQ</a><br>
299  <P>  <P>
300  (1) Why do we need JIT stacks?  (1) Why do we need JIT stacks?
301  <br>  <br>
# Line 269  Although it is possible, its updating ti Line 308  Although it is possible, its updating ti
308  we do the recursion in memory.  we do the recursion in memory.
309  </P>  </P>
310  <P>  <P>
311  (2) Why don't we simply allocate blocks of memory with <b>malloc()</b>?  (2) Why don't we simply allocate blocks of memory with <b>malloc()</b>?
312  <br>  <br>
313  <br>  <br>
314  Modern operating systems have a nice feature: they can reserve an address space  Modern operating systems have a nice feature: they can reserve an address space
# Line 280  only a single memory page (usually 4K) i Line 319  only a single memory page (usually 4K) i
319  grow up to 1M anytime if needed.  grow up to 1M anytime if needed.
320  </P>  </P>
321  <P>  <P>
322  (3) Who "owns" a JIT stack?  (3) Who "owns" a JIT stack?
323  <br>  <br>
324  <br>  <br>
325  The owner of the stack is the user program, not the JIT studied pattern or  The owner of the stack is the user program, not the JIT studied pattern or
# Line 317  list of the currently JIT studied patter Line 356  list of the currently JIT studied patter
356  <P>  <P>
357  (6) OK, the stack is for long term memory allocation. But what happens if a  (6) OK, the stack is for long term memory allocation. But what happens if a
358  pattern causes stack overflow with a stack of 1M? Is that 1M kept until the  pattern causes stack overflow with a stack of 1M? Is that 1M kept until the
359  stack is freed?  stack is freed?
360  <br>  <br>
361  <br>  <br>
362  Especially on embedded sytems, it might be a good idea to release  Especially on embedded sytems, it might be a good idea to release memory
363  memory sometimes without freeing the stack. There is no API for this at the  sometimes without freeing the stack. There is no API for this at the moment.
364  moment. Probably a function call which returns with the currently allocated  Probably a function call which returns with the currently allocated memory for
365  memory for any stack and another which allows releasing memory (shrinking the  any stack and another which allows releasing memory (shrinking the stack) would
366  stack) would be a good idea if someone needs this.  be a good idea if someone needs this.
367  </P>  </P>
368  <P>  <P>
369  (7) This is too much of a headache. Isn't there any better solution for JIT  (7) This is too much of a headache. Isn't there any better solution for JIT
370  stack handling?  stack handling?
371  <br>  <br>
372  <br>  <br>
373  No, thanks to Windows. If POSIX threads were used everywhere, we could throw  No, thanks to Windows. If POSIX threads were used everywhere, we could throw
374  out this complicated API.  out this complicated API.
375  </P>  </P>
376  <br><a name="SEC9" href="#TOC1">EXAMPLE CODE</a><br>  <br><a name="SEC10" href="#TOC1">EXAMPLE CODE</a><br>
377  <P>  <P>
378  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
379  callback.  callback.
# Line 359  callback. Line 398  callback.
398    
399  </PRE>  </PRE>
400  </P>  </P>
401  <br><a name="SEC10" href="#TOC1">SEE ALSO</a><br>  <br><a name="SEC11" href="#TOC1">SEE ALSO</a><br>
402  <P>  <P>
403  <b>pcreapi</b>(3)  <b>pcreapi</b>(3)
404  </P>  </P>
405  <br><a name="SEC11" href="#TOC1">AUTHOR</a><br>  <br><a name="SEC12" href="#TOC1">AUTHOR</a><br>
406  <P>  <P>
407  Philip Hazel (FAQ by Zoltan Herczeg)  Philip Hazel (FAQ by Zoltan Herczeg)
408  <br>  <br>
# Line 372  University Computing Service Line 411  University Computing Service
411  Cambridge CB2 3QH, England.  Cambridge CB2 3QH, England.
412  <br>  <br>
413  </P>  </P>
414  <br><a name="SEC12" href="#TOC1">REVISION</a><br>  <br><a name="SEC13" href="#TOC1">REVISION</a><br>
415  <P>  <P>
416  Last updated: 26 November 2011  Last updated: 04 May 2012
417  <br>  <br>
418  Copyright &copy; 1997-2011 University of Cambridge.  Copyright &copy; 1997-2012 University of Cambridge.
419  <br>  <br>
420  <p>  <p>
421  Return to the <a href="index.html">PCRE index page</a>.  Return to the <a href="index.html">PCRE index page</a>.

Legend:
Removed from v.784  
changed lines
  Added in v.975

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12