caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Damien Doligez <damien.doligez@inria.fr>
To: Caml Mailing List <caml-list@yquem.inria.fr>
Subject: Re: [Caml-list] Using the C FFI to wrap an OCaml library
Date: Tue, 12 Feb 2008 22:58:10 +0100	[thread overview]
Message-ID: <2350A969-FB1D-4F1A-AB97-4166C047A758@inria.fr> (raw)
In-Reply-To: <b256a4c50802082007p4e285226jbf8183b89d33bb48@mail.gmail.com>


On 2008-02-09, at 05:07, Jonathan Bryant wrote:

> On Fri, Feb 8, 2008 at 4:53 PM, Joel Stanley <jstanley@galois.com>  
> wrote:
>
>> Well, much of my curiosity stems from the fact that I know little  
>> about
>> the OCaml runtime or how the OCaml GC is invoked.  If the GC can  
>> ever be
>> invoked in its own thread, it seems like while the values (of type
>> 'value') are being passed back on the stack (but *after* the
>> caml__local_roots pointer has been reverted) there could be problems?
>>
>> If this can't ever happen, great! Why not?
>
>
> I believe GC cycles can only be kicked off by an allocation since  
> this is the only time that any memory would need to be recovered, so  
> this could never happen.  As I understand it, any GC cycles would  
> start and complete within the call to the allocation function.

That is true, but there is a more fundamental reason.

> Multi threaded code might be an exception, because there could be a  
> context switch and a GC triggered by another thread at just the  
> wrong moment.


Even if the GC was concurrent, it would have to get the roots from the
worker thread's stack in an synchronous fashion, so it would be safe.


On 2008-02-08, at 22:53, Joel Stanley wrote:

> So let's talk about a concrete example here.  Let's say that I have  
> some
> dynamically-allocated object on the OCaml heap (for discussion  
> purposes,
> say it's an instance of some simple 'stack' class) and that I've
> returned a reference to that object to a C function.  Are you saying
> that the stack contents (e.g., a deep copy of my object) themselves  
> are
> marshaled across this boundary every time?

No, it's just a pointer, and if your C function allocates in the OCaml
heap, you'd better declare that pointer as a root and make sure you
reread it after each time it could have moved.

> What about, perhaps, having an object registration mechanism on the
> OCaml so that a newly-allocated object's reference goes into a  
> (global)
> hash table, and an opaque handle (e.g., some fresh, unique integer
> value) is yielded back to C land?  This would require an explicit
> deallocation (just passing the handle back) to come from the C side,  
> but
> should keep the heap object around until such a deallocation call is
> made.  Right?

This is pretty much what caml_register_global_root and
caml_remove_global_root do, except that the handle isn't opaque.

-- Damien


      reply	other threads:[~2008-02-12 21:58 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-06 23:54 Joel Stanley
2008-02-07 22:26 ` [Caml-list] " Damien Doligez
2008-02-08 21:53   ` Joel Stanley
2008-02-09  4:07     ` Jonathan Bryant
2008-02-12 21:58       ` Damien Doligez [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2350A969-FB1D-4F1A-AB97-4166C047A758@inria.fr \
    --to=damien.doligez@inria.fr \
    --cc=caml-list@yquem.inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).