Bill Allombert on Mon, 06 Feb 2017 00:36:54 +0100


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

Re: Giac for Debian: test suite segfaults with pthread pari


On Sun, Feb 05, 2017 at 06:33:00PM +0000, Ximin Luo wrote:
> Ximin Luo:
> > [..]
> > 
> > In Debian pari is compiled with pthreads. To make the compilation succeed, we need to patch Giac like this: https://git.archlinux.org/svntogit/community.git/tree/trunk/giac-pari-thread.patch?h=packages/giac
> > 
> > however I still get segfaults when running Giac's test suite. Stack thread is at the end of this email, but basically I think the reason is that 
> > 
> > src/kernel/none/level1.h:106
> >   if (x > (avma-pari_mainstack->bot) / sizeof(long))
> > 
> > here pari_mainstack is either NULL or uninitialised. So I guess we need to add some initialisation functions to Giac, to fix this problem. But I'm not familiar with pari, so I don't know what to do here. Any help or guidance would be appreciated.
> > 
> > [..]
> 
> Hi, I think I have figured out how to resolve this issue, it was to do
> with TLS rather than pthreads. The solution was to fix Giac to call
> pari_init_opts for every new thread, instead of only once.

I suggest you read the appendix B of the libpari manual:
<http://pari.math.u-bordeaux.fr/pub/pari/manuals/2.9.0/libpari.pdf>
which explain how threads are supposed to be setup.

It seems GIAC assumes that PARI is not MT-safe and use mutex to
serialize PARI call. 

The patch look odd. The code below is not a good start:

+#ifdef ENABLE_TLS
+  extern THREAD void *PARI_stack_limit;
+#else
   extern void *PARI_stack_limit;
+#endif

first THREAD is defined to the empty string when ENABLE_TLS is not
defined, so just 
extern THREAD void *PARI_stack_limit;
would do.
Second, there are really no need to mess with this variable when
you can use pari_stackcheck_init().

Cheers,
Bill.