English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
Heaps size problems with "caml_alloc_small" in foreign function interfaces
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2008-07-11 (10:21)
From: Sean Seefried <sean.seefried@n...>
Subject: Re: [Caml-list] Heaps size problems with "caml_alloc_small" in foreign function interfaces

On 11/07/2008, at 7:40 PM, Richard Jones wrote:

> On Fri, Jul 11, 2008 at 06:21:51PM +1000, Sean Seefried wrote:
>> I'm having a problem where sometimes a call to "caml_alloc_small"  
>> from
>> C results in a segmentation fault. If I increase the size of the  
>> stack
>> using OCAMLRUNPARAM=s=1000k then I don't get the crash anymore. It
>> seems strange that I have to increase the size of the heap manually
>> like this. Is this because I'm calling this function from C?
> Seems like you have confusion over heap & stack.
> First of all, caml_alloc_small is limited to small allocations, so
> number of words allocated must be <= Max_young_wosize.  You don't post
> any example code so we can't see whether that is true in your code.


is what seemed to cause the problem. I'm shying away from posting more  
code since it is auto-generated from CamlIDL and is very verbose. I  
didn't write it myself.

> Secondly (and much more likely to be the problem), the caml_alloc*
> functions allocate uninitialised memory.  If the garbage collector

What do you mean by "uninitialised memory"?

> gets to run before you've properly initialized all the fields then the
> GC will hit an uninitialised field and a segfault could be the result.
>  eg: This is a fail:
>  v = caml_alloc (2, 0);
>  vv = caml_alloc (3, 0);  /* GC could run here */
>  Store_field (v, 0, vv);

What do you do about this? Is there a way to stop the GC from running  
for a period of time?

> Changing the _stack_ size (or other tunables) probably just changes
> something about when the garbage collector runs, and thus moves the
> bug around.
>> If I want to increase the size of the heap in C how do I do this?
>> Could I write a "safe" caml_alloc_small which first checks to see if
>> there is enough memory and then increases the heap size if not?
> The "size of the heap in C" is (for most operating systems) extended
> automatically by malloc.  What you're saying here isn't necessary -
> you must have some other bug.

I wasn't very clear but I meant changing the OCaml heap size using C