GMP terminates when out of memory
Roberto Bagnara
bagnara at cs.unipr.it
Fri Dec 26 19:32:55 CET 2008
Torbjorn Granlund wrote:
> "Bjarke Roune" <bjarke at daimi.au.dk> writes:
>
> I am writing a C++ library, and it has been very convenient and
> efficient to use GMP. The thing is that I would like my library to
> recover from running out of memory, and using GMP seems to make this
> impossible, since the GMP documentation at
>
> http://gmplib.org/manual/Custom-Allocation.html
>
> states that
>
> "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 am wondering whether this is likely to change soon, or if it is more
> like "if sometime in the future someone throws a nice patch at us,
> we'll consider applying it" ?
>
> What sort of behaviour would you suggest?
Memory allocated by the failed computation should be released, and the
state should be set to a valid one that allows the computation to proceed.
> I suppose much of this can be done with the custom allocation interface
> already.
Yes. This is what we are doing since several years:
1) We compile GMP with -fexceptions added to CPPFLAGS (several GNU/Linux
distribution do that systematically for any package). This way exceptions
raised by C++ code can be propagated through C code. It seems that
this propagation works for GMP, at least for the (few) GMP functions
we use.
2) We do
mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free)
where
extern "C" void*
cxx_malloc(size_t size) {
void* p = malloc(size);
if (p != 0 || size == 0)
return p;
throw std::bad_alloc();
}
extern "C" void*
cxx_realloc(void* q, size_t, size_t new_size) {
void* p = realloc(q, new_size);
if (p != 0 || new_size == 0)
return p;
throw std::bad_alloc();
}
extern "C" void
cxx_free(void* p, size_t) {
free(p);
}
Of course we know that, in light of
http://gmplib.org/manual/Custom-Allocation.html
the GMP specifications do no guarantee the behavior we are
relying upon. However, years of use never revealed a problem:
the fragment of GMP we rely upon seems to do the right thing.
It would be great if GMP could, in the future, ensure
that the right thing systematically happens: C++ users
(of any library, not just GMP) increasingly expect that
std::bad_alloc can be dealt with gracefully.
All the best,
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 gmp-discuss
mailing list