
Jan Wielemaker wrote:
Hi Roberto,
On Tuesday 02 October 2007 07:42, Roberto Bagnara wrote:
Starting from version 5.6.38 of SWI-Prolog, applications using SWI-Prolog and GMP started failing. The problem is due to the fact that SWI-Prolog overrides the memory allocation functions used by GMP by calling mp_set_memory_functions(). I have observed two instances of the problem, one of which was reported by users of the Parma Polyhedra Library:
- a variable allocated in the C++ code before SWI-Prolog changes the
allocation functions is destroyed after SWI-Prolog has done that (this results in a segmentation fault); 2) while executing the C++ code, the realloc function set by SWI-Prolog is called (this results into an invalid pointer detected by glibc).
Both instances are caused by the fact that memory allocated by GMP's default functions is reallocated/freed by SWI-Prolog's functions. Something that is guaranteed to cause problems. However, even if all memory allocation was done by the SWI-Prolog's functions, I am sure we would have other troubles. I am not sure what is the way out, but the problem is rather serious. All the best,
Rebinding the allocation functions is done to allow SWI-Prolog to detect and act upon GMP memory overflows. Unfortunately GMP is very weak in allowing applications to act gracefully on overflows. I see no reason for problems as long as you initialize Prolog before touching any GMP number.
This is not always possible, unfortunately.
If that should be the case anyway, we must add something to the foreign interface that allows for initializing Prolog without rebinding the GMP allocation.
This is certainly useful. But what happens if, in some computation in the C++ code that has nothing to do with SWI-Prolog, pl_abort() is called (I am looking at pl-gmp.c)? Perhaps I am missing something, but this will break the overall application completely. I think SWI-Prolog should have his own private version of GMP if it wants to change the allocation functions. In other words, setting the allocation functions on a shared GMP can only be done at the overall application level: if every component does that on its own, things are going to break. All the best,
Roberto