Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: jonathan@kimmitt.co.uk
To: fa.caml@googlegroups.com
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Thread-private data in C stubs
Date: Tue, 28 Aug 2012 04:48:39 -0700 (PDT)	[thread overview]
Message-ID: <506691e7-68e5-4092-a9fc-4cc8711235d2@googlegroups.com> (raw)
In-Reply-To: <fa.rchhrYogU61pR6TqMyzDz8fSIoA@ifi.uio.no>

On Monday, 27 August 2012 22:08:18 UTC+1, Andre Nathan  wrote:
> On Mon, 2012-08-27 at 16:41 -0300, Andre Nathan wrote:
> 
> > Hello
> 
> > 
> 
> > I'm writing stubs to a C library uses pthreads and exposes two functions
> 
> > to get and set thread-private data, getpriv(ctx) and setpriv(ctx, p)
> 
> > where ctx is some opaque context object, and p is a void* pointer.
> 
> > 
> 
> > What's the best way to deal with this from the stub code, ie., how do I
> 
> > avoid the thread-private data to be garbage collected when the OCaml
> 
> > variable goes out of scope?
> 
> > 
> 
> > Since the library in question uses threads internally, this needs to be
> 
> > a thread-safe solution.
> 
> 
> 
> For the record, with help from #ocaml, I got it to work like this:
> 
> 
> 
> struct priv {
> 
>   value v;
> 
> };
> 
> 
> 
> CAMLprim value
> 
> caml_setpriv(value ctx_val, value priv_val)
> 
> {
> 
>     CAMLparam2(ctx_val, priv_val);
> 
>     context *ctx = (context *)ctx_val;
> 
>     struct priv *p;
> 
>    
> 
>     p = getpriv(ctx);
> 
>     if (p != NULL) {
> 
>         caml_remove_global_root(&(p->v));
> 
>         caml_stat_free(p);
> 
>     }
> 
> 
> 
>     p = caml_stat_alloc(sizeof(*p));
> 
>     p->v = priv_val;
> 
>     ret = setpriv(ctx, p);
> 
>     caml_register_global_root(&(p->v));
> 
> 
> 
>     CAMLreturn(Val_unit);
> 
> }
> 
> 
> 
> 
> 
> -- 
> 
> Caml-list mailing list.  Subscription management and archives:
> 
> https://sympa-roc.inria.fr/wws/info/caml-list
> 
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> 
> Bug reports: http://caml.inria.fr/bin/caml-bugs

Dear Andre, in my view it is needlessly inefficient to create a new global root for every item which crosses the C-interface. I used a system which uses dlmalloc to carve up an allocated caml custom block into convenient sized chunks. Each of these large blocks could be a local root or they could be chained together from one global root. Another advantage is that subroutines written in C that allocate memory do not need to know they are running under caml if dlmalloc is compiled to replace the system malloc. The one downside is that it is difficult to track when the global blocks are ready to be released. My impression is ocaml runtime would get very slow if there were huge numbers of global roots.

       reply	other threads:[~2012-08-28 11:48 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <fa.P6AfawLTOdz6VcNoVpOatntnvpI@ifi.uio.no>
     [not found] ` <fa.rchhrYogU61pR6TqMyzDz8fSIoA@ifi.uio.no>
2012-08-28 11:48   ` jonathan [this message]
2012-08-27 19:41 Andre Nathan
2012-08-27 21:07 ` Andre Nathan

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=506691e7-68e5-4092-a9fc-4cc8711235d2@googlegroups.com \
    --to=jonathan@kimmitt.co.uk \
    --cc=caml-list@inria.fr \
    --cc=fa.caml@googlegroups.com \
    /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