Bill Allombert on Thu, 19 May 2016 21:59:13 +0200


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

Re: GMP memory allocation and Macaulay2


On Thu, May 19, 2016 at 02:58:16PM -0400, Doug Torrance wrote:
> Hello!
> 
> 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.

> 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:

void
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);
  pari_init_opts(parisize,maxprime,init_opts);
  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.

Cheers,
Bill.