Bill Allombert on Mon, 26 Jun 2017 15:04:29 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: GMP memory allocation and Macaulay2 (cont.) |
On Fri, Jun 23, 2017 at 12:15:26PM -0400, Doug Torrance wrote: > On 06/23/2017 03:53 AM, Bill Allombert wrote: > >On Wed, Jun 21, 2017 at 04:33:12PM -0400, Doug Torrance wrote: > >>Hello! > >>A while ago [1], I inquired about an segfaults when Macaulay2 is linked > >>against both PARI and GMP due to memory allocation issues. > >> > >>Note that I tried using the new-ish INIT_noINTGMPm option to pari_init_opts > >>when calling from Macaulay2 to no avail. > >> > >>I promised a backtrace to help identify the problem, but am only now getting > >>around to it. > >> > >>Here is the output from gdb: > >>(gdb) bt > >>#0 __GI___libc_free (mem=0xfffffffffffffff8) at malloc.c:2966 > >>#1 0x00007ffff40be12f in pari_var_close () > >> from /usr/lib/x86_64-linux-gnu/libpari-gmp-tls.so.5 > >>#2 0x00007ffff4102d7c in pari_close_opts () > >> from /usr/lib/x86_64-linux-gnu/libpari-gmp-tls.so.5 > > > >Hello Doug, I found a potential bug in pari_close_opts(). > > > >Could you try to comment out the call to pari_kernel_close() in > >pari_close_opts() ? > > That appears to work! Do you know why ? First pari_kernel_close is called after pari_var_close(), and pari_kernel_close() does: void pari_kernel_close(void) { 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); if (new_gmp_malloc==pari_malloc) new_gmp_malloc = old_gmp_malloc; if (new_gmp_realloc==pari_gmp_realloc) new_gmp_realloc = old_gmp_realloc; if (new_gmp_free==pari_gmp_free) new_gmp_free = old_gmp_free; mp_set_memory_functions(new_gmp_malloc, new_gmp_realloc, new_gmp_free); } so normally, if you do not call pari_kernel_init, it should just do 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); which should be harmless. Cheers, Bill.