Bill Allombert on Tue, 19 Sep 2006 20:30:16 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: PARI_stack_limit


On Sun, Sep 17, 2006 at 08:33:17PM +0200, Bill Allombert wrote:
> So I would propose we:
> 
> 1) make stack-checking optional through a init_opts options.

I changed my mind about 1. Since pari_init_stackcheck() does not
actually mess with the system in any way (it just set a variable)
it is not suitable for an init_opts option.

> 2) make pari_init_stackcheck public and document it.

Here a patch that do the first part, making sure it is available even
if STACK_CHECK is not defined (which fix a major bug in 2.3).

The public pari_init_stackcheck() also accept NULL as argument and in
that case disable the stack checking completly.

It would make sense at this stage to make PARI_stack_limit static
but this would break backward compatibility.

> At this point the question is whether pari_thread_init should call
> pari_init_stackcheck itself

The patch does not settle that issue. Note that under --enable-tls, each
new thread start automatically with PARI_stack_limit=NULL and thus 
with disabled stack-cheking.

Cheers,
Bill.
Index: src/language/init.c
===================================================================
RCS file: /home/cvs/pari/src/language/init.c,v
retrieving revision 1.313
diff -u -r1.313 init.c
--- src/language/init.c	19 Sep 2006 11:36:22 -0000	1.313
+++ src/language/init.c	19 Sep 2006 17:34:42 -0000
@@ -193,13 +193,19 @@
 /*                       C STACK SIZE CONTROL                        */
 /*                (avoid core dump on deep recursion)                */
 /*********************************************************************/
+THREAD void *PARI_stack_limit = NULL;
+
 #ifdef STACK_CHECK
 /* adapted from Perl code written by Dominic Dunlop */
-THREAD void *PARI_stack_limit = NULL;
 
 #  ifdef __EMX__				/* Emulate */
-#    define STACK_CHECK_INIT(b)		\
-	((void)b, PARI_stack_limit = get_stack(1./16, 32*1024))
+void
+pari_init_stackcheck(void *stack_base)
+{
+  (void) stack_base;
+  if (!stack_base) { PARI_stack_limit = NULL; return; }
+  PARI_stack_limit = get_stack(1./16, 32*1024);
+}
 #  else /* !__EMX__ */
 #include <sys/types.h>
 #include <sys/time.h>
@@ -209,12 +215,12 @@
  * be used on the stack. Leave PARI_stack_limit at its initial value (NULL)
  * to show no check should be made [init failed]. Assume stack grows downward.
  */
-static void
+void
 pari_init_stackcheck(void *stack_base)
 {
   struct rlimit rip;
   ulong size;
-
+  if (!stack_base) { PARI_stack_limit = NULL; return; }
   if (getrlimit(RLIMIT_STACK, &rip)) return;
   size = rip.rlim_cur;
   if (size == (ulong)RLIM_INFINITY || size > (ulong)stack_base)
@@ -222,11 +228,14 @@
   else
     PARI_stack_limit = (void*)((ulong)stack_base - (size/16)*15);
 }
-#    define STACK_CHECK_INIT(b) pari_init_stackcheck(b)
 #  endif /* !__EMX__ */
 
 #else
-#    define STACK_CHECK_INIT(b)		((void)b)
+void
+pari_init_stackcheck(void *stack_base)
+{
+  PARI_stack_limit = NULL;
+}
 #endif /* STACK_CHECK */
 
 /*********************************************************************/
@@ -591,7 +600,7 @@
 {
   ulong u;
 
-  STACK_CHECK_INIT(&u);
+  pari_init_stackcheck(&u);
   if ((init_opts&INIT_DFTm)) 
     { GP_DATA = default_gp_data(); pari_init_defaults(); }
   err_catch_stack=NULL;
Index: src/headers/paridecl.h
===================================================================
RCS file: /home/cvs/pari/src/headers/paridecl.h,v
retrieving revision 1.594
diff -u -r1.594 paridecl.h
--- src/headers/paridecl.h	18 Sep 2006 14:05:16 -0000	1.594
+++ src/headers/paridecl.h	19 Sep 2006 17:35:35 -0000
@@ -1247,6 +1247,7 @@
 void    pari_err(long numerr, ...);
 void    pari_init_opts(size_t parisize, ulong maxprime, ulong init_opts);
 void    pari_init(size_t parisize, ulong maxprime);
+void    pari_init_stackcheck(void *stack_base);
 void    pari_sig_init(void (*f)(int));
 void    pari_thread_init(size_t parisize);
 void    pari_thread_close(void);