[PPL-devel] GMP memory allocation problem in SWI-Prolog 5.6.38 and following versions

Roberto Bagnara bagnara at cs.unipr.it
Mon Oct 8 11:45:58 CEST 2007


Jan Wielemaker wrote:
>>> The only thing you are allowed to do from
>>> the GMP allocation functions is stop the process.
>> This is not my understanding: where did you get this restriction from?
> 
> Quoting from the GMP manual (GMP 4.2.1, SuSE RPM):
> 
> ----------------------------------------------------------------
>    There's currently no defined way for the allocation functions to
> recover from an error such as out of memory, they must terminate
> program execution.  A `longjmp' or throwing a C++ exception will have
> undefined results.  This may change in the future.
> ----------------------------------------------------------------

I see.  Well, I think the situation is that they do not make promises
(not now) but either they will need to do so if they want a decent
C++ interface.  My experience is that when you get an out of memory
error from GMP it is perfectly safe to discard the GMP object involved
and computation can continue: we are testing this all the time and it
never ever failed.

> So, I wonder how you safely recover. Surely if you call Prolog, which
> calls a GMP function, which gets you using longjmp or a C++ exception
> back to the C++ program, you haven't made Prolog particulary happy.
> Seems from the rest that you are calling C++ from Prolog, which might
> make things a bit better ...

Yes, we are calling C++ from Prolog.

>>> Anyway for the others, I added
>>>
>>> 	PL_action(PL_GMP_SET_ALLOC_FUNCTIONS, TRUE)
>>>
>>> if you want Prolog's GMP allocation initialised *now* (without
>>> initializing the rest of SWI-Prolog).  or
>>>
>>> 	PL_action(PL_GMP_SET_ALLOC_FUNCTIONS, FALSE)
>>>
>>> If you want to stop Prolog from setting the allocation functions.  Must
>>> be called before PL_initialise(), of course.
>> I see how to use that in the foreign-calls-Prolog case.
>> How can I achieve that in the Prolog-calls-foreign case (which is the one
>> I am mostly interested in)?
> 
> You mean you load a shared object into Prolog? Good!

No, I am having problems with libraries statically linked to the SWI-Prolog
system.  These libraries (written in C++) use several statically allocated
GMP numbers.  When the system starts, the statically allocated variables
are initialized with the GMP's memory allocation function.  Then SWI-Prolog
is given control and the allocation functions are changed.  Then the system
exits and the statically allocated variables are destroyed with the wrong
(i.e., SWI-Prolog's) allocation function: which results into a segmentation
fault.  This change you have made to SWI-Prolog is really breaking everything
here.
Cheers,

     Roberto

-- 
Prof. Roberto Bagnara
Computer Science Group
Department of Mathematics, University of Parma, Italy
http://www.cs.unipr.it/~bagnara/
mailto:bagnara at cs.unipr.it





More information about the PPL-devel mailing list