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

Roberto Bagnara bagnara at cs.unipr.it
Mon Oct 8 15:54:50 CEST 2007


Jan Wielemaker wrote:
> On Monday 08 October 2007 14:23, Roberto Bagnara wrote:
>> Jan Wielemaker wrote:
>>>>>>> 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.
>>> I'm not getting it. I think there are two situations: you embed Prolog,
>>> so you call PL_initialise() and you can call the
>>> PL_action(PL_GMP_SET_ALLOC_FUNCTIONS, FALSE) before it or you keep the
>>> Prolog toplevel and you load your code as a .so file into Prolog. I
>>> think both work fine, even with global C++ initializers. What am I
>>> missing?
>> Probably the fact that the constructors of global variables are all
>> run (in unspecified order) before main() is given control.
>> You can compile the following with
> 
> This is the case if you embed SWI-Prolog, but in main() you call
> 
> 	PL_action(PL_GMP_SET_ALLOC_FUNCTIONS, FALSE)
> 
> and Prolog won't touch the GMP allocator anymore. If you link your code
> to a shared object the global constructores are executed at the moment
> you load the .so file into Prolog.  Still puzzled ...

I am not linking dynamically (this does not work everywhere), I am linking
statically.  The Automake rules I use are of the form

ppl_pl$(EXEEXT): ppl_swiprolog.lo ppl_pl.o
         plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
                 -ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
                 -o $@ ppl_swiprolog.o ppl_pl.o \
                 -L$(top_builddir)/src/.libs -lppl \
                 $(WATCHDOG_LINK_OPTIONS) \
                 @extra_libraries@

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