Bill Allombert on Thu, 05 Jan 2006 20:21:47 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: PARI and POSIX threads |
Hello PARI-dev, Here a new patch against current CVS for --enable-tls support. This one is smaller due to lot of fix in PARI 2.2.12 proper fix issues with the MPQS engine. I expect all the basic library functions to work fine in multi-threaded programms (excluding e.g. the interpretor and the I/O facility), but in practice this patch is entirely untested outside very small test cases. See previous post here for example on usage. Cheers, Bill.
Index: Configure =================================================================== RCS file: /home/cvs/pari/Configure,v retrieving revision 1.148 diff -u -r1.148 Configure --- Configure 8 Nov 2005 14:09:34 -0000 1.148 +++ Configure 5 Jan 2006 18:49:43 -0000 @@ -143,6 +143,7 @@ sizeof_long doubleformat\ X11 X11_INC X11_LIBS which_graphic_lib\ FLTKDIR FLTK_LIBS QTDIR QTLIB\ + enable_tls\ $_test_list\ $_install_list\ $_perl_list\ Index: config/get_config_options =================================================================== RCS file: /home/cvs/pari/config/get_config_options,v retrieving revision 1.29 diff -u -r1.29 get_config_options --- config/get_config_options 14 Dec 2005 17:08:53 -0000 1.29 +++ config/get_config_options 5 Jan 2006 18:49:43 -0000 @@ -105,6 +105,9 @@ --with-fltk) with_fltk=yes ;; --with-fltk=*) with_fltk=`echo "$1" | sed -e 's/[-a-z]*=//'` ;; + --enable-tls) enable_tls=yes;; + --enable-tls=*) enable_tls=`echo "$1" | sed -e 's/[-a-z]*=//'` ;; + --disable-tls) enable_tls=no;; *) echo "*** Unrecognized option $1." >&2; error=true;; esac shift @@ -143,6 +146,7 @@ Additional developer options: -g creates debugging version (in Oxxx.dbg) -pg creates profiling version (in Oxxx.prf) + --enable-tls (*experimental*) enable thread-local stack Installation directories: --prefix=<dir> install files in <dir> (default $prefix) Index: config/paricfg.h.SH =================================================================== RCS file: /home/cvs/pari/config/paricfg.h.SH,v retrieving revision 1.26 diff -u -r1.26 paricfg.h.SH --- config/paricfg.h.SH 9 Nov 2005 18:21:51 -0000 1.26 +++ config/paricfg.h.SH 5 Jan 2006 18:49:43 -0000 @@ -195,4 +195,8 @@ yes) echo '#define HAS_STAT' >> $file;; esac +case $enable_tls in +yes) echo '#define ENABLE_TLS' >> $file;; +esac + echo '#endif' >> $file Index: src/basemath/trans1.c =================================================================== RCS file: /home/cvs/pari/src/basemath/trans1.c,v retrieving revision 1.205 diff -u -r1.205 trans1.c --- src/basemath/trans1.c 15 Dec 2005 13:37:08 -0000 1.205 +++ src/basemath/trans1.c 5 Jan 2006 18:49:43 -0000 @@ -29,11 +29,20 @@ # define CBRTVERYBIGINT 1291 #endif -static GEN glog2; +static THREAD GEN glog2; void pari_init_floats(void) { geuler = gpi = bernzone = glog2 = NULL; +} + +void +pari_close_floats(void) +{ + if (geuler) gunclone(geuler); + if (gpi) gunclone(gpi); + if (bernzone) gunclone(bernzone); + if (glog2) gunclone(glog2); } /********************************************************************/ Index: src/headers/paricom.h =================================================================== RCS file: /home/cvs/pari/src/headers/paricom.h,v retrieving revision 1.95 diff -u -r1.95 paricom.h --- src/headers/paricom.h 13 Dec 2005 18:42:48 -0000 1.95 +++ src/headers/paricom.h 5 Jan 2006 18:49:43 -0000 @@ -97,7 +97,7 @@ /* Common global variables: */ extern ulong DEBUGFILES, DEBUGLEVEL, DEBUGMEM, precdl; extern long *ordvar; -extern GEN bernzone,gpi,geuler; +extern THREAD GEN bernzone,gpi,geuler; extern GEN polvar,*pol_1,*pol_x,primetab; extern GEN gen_m1,gen_1,gen_2,ghalf,gi,gen_0,gnil; Index: src/headers/paridecl.h =================================================================== RCS file: /home/cvs/pari/src/headers/paridecl.h,v retrieving revision 1.559 diff -u -r1.559 paridecl.h --- src/headers/paridecl.h 17 Dec 2005 16:10:11 -0000 1.559 +++ src/headers/paridecl.h 5 Jan 2006 18:49:43 -0000 @@ -1249,6 +1249,8 @@ void pari_init_opts(size_t parisize, ulong maxprime, ulong init_opts); void pari_init(size_t parisize, ulong maxprime); void pari_sig_init(void (*f)(int)); +void pari_thread_init(size_t parisize); +void pari_thread_close(void); void pari_warn(long numerr, ...); GEN reorder(GEN x); GEN shallowcopy(GEN x); Index: src/headers/paripriv.h =================================================================== RCS file: /home/cvs/pari/src/headers/paripriv.h,v retrieving revision 1.97 diff -u -r1.97 paripriv.h --- src/headers/paripriv.h 15 Dec 2005 12:39:22 -0000 1.97 +++ src/headers/paripriv.h 5 Jan 2006 18:49:43 -0000 @@ -826,6 +826,7 @@ GEN padic_sqrtn_ram(GEN x, long e); GEN padic_sqrtn_unram(GEN x, GEN n, GEN *zetan); void pari_init_floats(void); +void pari_close_floats(void); GEN rootsof1complex(GEN n, long prec); GEN rootsof1padic(GEN n, GEN y); Index: src/headers/paristio.h =================================================================== RCS file: /home/cvs/pari/src/headers/paristio.h,v retrieving revision 1.34 diff -u -r1.34 paristio.h --- src/headers/paristio.h 14 Dec 2005 16:42:48 -0000 1.34 +++ src/headers/paristio.h 5 Jan 2006 18:49:43 -0000 @@ -74,7 +74,7 @@ #define TEXSTYLE_PAREN 2 #define TEXSTYLE_BREAK 4 -extern pari_sp avma,bot,top; +extern pari_sp THREAD avma,bot,top; #define DISABLE_MEMUSED (size_t)-1 extern size_t memused; extern byteptr diffptr; Index: src/headers/parisys.h =================================================================== RCS file: /home/cvs/pari/src/headers/parisys.h,v retrieving revision 1.12 diff -u -r1.12 parisys.h --- src/headers/parisys.h 23 Nov 2005 12:25:48 -0000 1.12 +++ src/headers/parisys.h 5 Jan 2006 18:49:43 -0000 @@ -62,6 +62,11 @@ # define INLINE_IS_STATIC # define INLINE static #endif +#ifdef ENABLE_TLS +# define THREAD __thread +#else +# define THREAD +#endif #if defined(_WIN32) || defined(__CYGWIN32__) /* ANSI C does not allow to longjmp() out of a signal handler, in particular, Index: src/kernel/none/mp_indep.c =================================================================== RCS file: /home/cvs/pari/src/kernel/none/mp_indep.c,v retrieving revision 1.32 diff -u -r1.32 mp_indep.c --- src/kernel/none/mp_indep.c 12 Dec 2005 08:27:00 -0000 1.32 +++ src/kernel/none/mp_indep.c 5 Jan 2006 18:49:43 -0000 @@ -610,7 +610,7 @@ /** RANDOM INTEGERS **/ /** **/ /********************************************************************/ -static long pari_randseed = 1; +static THREAD long pari_randseed = 1; /* BSD rand gives this: seed = 1103515245*seed + 12345 */ /*Return 31 ``random'' bits.*/ Index: src/language/init.c =================================================================== RCS file: /home/cvs/pari/src/language/init.c,v retrieving revision 1.296 diff -u -r1.296 init.c --- src/language/init.c 15 Dec 2005 12:39:22 -0000 1.296 +++ src/language/init.c 5 Jan 2006 18:49:43 -0000 @@ -29,7 +29,7 @@ #endif GEN gnil, gen_0, gen_1, gen_m1, gen_2, ghalf, gi; -GEN gpi, geuler, bernzone; +THREAD GEN gpi, geuler, bernzone; GEN primetab; /* private primetable */ byteptr diffptr; FILE *pari_outfile, *errfile, *logfile, *infile; @@ -44,7 +44,7 @@ long *ordvar; GEN polvar, *pol_1, *pol_x; -pari_sp bot, top, avma; +THREAD pari_sp bot, top, avma; size_t memused; void *global_err_data; @@ -585,6 +585,20 @@ return gp_init_entrees(new_fun_set? MODULES: OLDMODULES, functions_hash); } +void +pari_thread_init(size_t parisize) +{ + init_stack(parisize); + pari_init_floats(); +} + +void +pari_thread_close(void) +{ + free((void *)bot); + pari_close_floats(); +} + /* initialize PARI data. Initialize [new|old]fun to NULL for default set. */ void pari_init_opts(size_t parisize, ulong maxprime, ulong init_opts) @@ -1993,9 +2007,9 @@ TIMERstart(pari_timer *T) { (void)TIMER(T); } long -timer(void) { static pari_timer T; return TIMER(&T);} +timer(void) { static THREAD pari_timer T; return TIMER(&T);} long -timer2(void) { static pari_timer T; return TIMER(&T);} +timer2(void) { static THREAD pari_timer T; return TIMER(&T);} void msgTIMER(pari_timer *T, char *format, ...) Index: src/modules/mpqs.c =================================================================== RCS file: /home/cvs/pari/src/modules/mpqs.c,v retrieving revision 1.72 diff -u -r1.72 mpqs.c --- src/modules/mpqs.c 31 Dec 2005 17:38:58 -0000 1.72 +++ src/modules/mpqs.c 5 Jan 2006 18:49:43 -0000 @@ -76,6 +76,12 @@ #include "pari.h" #include "paripriv.h" +#ifdef ENABLE_TLS +static THREAD char *saveptr; +#define strtok(x,y) strtok_r(x,y,&saveptr) +#endif + +/** DEBUG **/ /* #define MPQS_DEBUG_VERBOSE 1 */ /* histograms are pretty, but don't help performance after all (see below) */ /* #define MPQS_USE_HISTOGRAMS */ @@ -355,9 +361,9 @@ /* our own pointer to PARI's or to our own prime diffs table. * NB the latter is never freed, unless we need to replace it with * an even larger one. */ -static byteptr mpqs_diffptr = NULL; -static long mpqs_prime_count = 0; -static int mpqs_use_our_diffptr = 0; +static THREAD byteptr mpqs_diffptr = NULL; +static THREAD long mpqs_prime_count = 0; +static THREAD int mpqs_use_our_diffptr = 0; /* return next prime larger than p, using *primes_ptr on the diffptr table * first and pari's other wits after that */