Doug Torrance on Thu, 19 May 2016 22:55:27 +0200

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

Re: GMP memory allocation and Macaulay2

On 05/19/2016 03:59 PM, Bill Allombert wrote:
On Thu, May 19, 2016 at 02:58:16PM -0400, Doug Torrance wrote:

Currently, PARI sets the GMP memory allocation functions in
pari_kernel_init().  However, this may cause problems for
applications which use both the PARI and GMP libraries such as
Macaulay2.  Building Macaulay2 against unpatched GMP and PARI
libraries causes segmentation faults.
You issue is related to the bug #1317.
Do you know why the segmentation faults occurs ? This is the
crux of the matter.

I don't recall at the moment. I'll work on getting back to you with a backtrace.

Currently, Macaulay2 builds its own GMP (actually MPIR, a drop-in
replacement) in which mp_set_memory_functions() does nothing.  This
is not ideal, however.  For example, this is the main problem
keeping Macaulay2 out of Debian, as it cannot be built with the
current Debian GMP and PARI packages.  (See [1] for some discussion
on this matter.)

Would it be possible to remove the calls to
mp_set_memory_functions() from PARI?
PARI only runs pari_kernel_init() once (in pari_init_opts),
so you can just write a wrapper around pari_init() or pari_init_opts()
that saves the values returned by mp_get_memory_functions() and resets
them using mp_set_memory_functions() just after pari_init:

my_pari_init_opts(size_t parisize, ulong maxprime, ulong init_opts)
   void *(*new_gmp_malloc)(size_t new_size);
   void *(*new_gmp_realloc)(void *ptr, size_t old_size, size_t new_size);
   void (*new_gmp_free)(void *ptr, size_t old_size);
   mp_get_memory_functions (&new_gmp_malloc, &new_gmp_realloc, &new_gmp_free);
   mp_set_memory_functions(new_gmp_malloc, new_gmp_realloc, new_gmp_free);

It is not possible to remove the call to mp_set_memory_functions() from
the Debian packages in a reasonable timeframe.

Great suggestion -- thank you!  I'll try it out.