From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by walapai.inria.fr (8.13.6/8.13.6) with ESMTP id q44HO7ai015651 for ; Fri, 4 May 2012 19:24:08 +0200 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuoBAFEQpE/RVdIpkGdsb2JhbABFsl0IIgEBAQEJCQ0HFAQjggkBAQEDARICExkBGx0BAwELBgULOyIBEQEFARwGEyKHXAEDBgULnDsJA4wkgnOFCAoZJw0VQoh2AQULkQIElX6BEY1RPYQM X-IronPort-AV: E=Sophos;i="4.75,532,1330902000"; d="scan'208";a="142615386" Received: from mail-pz0-f41.google.com ([209.85.210.41]) by mail4-smtp-sop.national.inria.fr with ESMTP/TLS/RC4-SHA; 04 May 2012 19:23:49 +0200 Received: by dakp5 with SMTP id p5so3497583dak.0 for ; Fri, 04 May 2012 10:23:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=v+Ypm8SaB/NYZrTp2vDSm5YBh8KcSLFj/T8Xip+S6Lw=; b=Y0ulK0+QX3yaPZbBeUNC1x66SymxbU6pMeDHdVv+Rwty3QGnTB/yDbGwWxKrEWmvxx s1QnoTy77/nSoJ12IaH9hPqtsA+xVf3fZVZT6iS2IyDcSCQzHTbxJtyCV8CLEz/Lfq2Y w/ywbxKO3A6YBVaTuvjXN+/WrJ4ebQLQGhjKHnJB+8QVKpA8vQvbqMLdO0d29D2cas9A fG0hy19Brhr9C1TWI2pn/Hcdxj9EJNisZym2WmX6CVD920qfneV6laY1K+8gGSOiHkyI u0ztX0U9MJwZK0DL8s5bJFVZmhIrLSoaHiafqaZuS4GD5+yZp6jumEMMMCLixqyRK/cY H3lg== MIME-Version: 1.0 Received: by 10.68.227.169 with SMTP id sb9mr20416874pbc.157.1336152227905; Fri, 04 May 2012 10:23:47 -0700 (PDT) Received: by 10.68.228.194 with HTTP; Fri, 4 May 2012 10:23:47 -0700 (PDT) In-Reply-To: <8762ccqqt0.fsf@frosties.localnet> References: <871un1z8sq.fsf@frosties.localnet> <8762ccqqt0.fsf@frosties.localnet> Date: Fri, 4 May 2012 18:23:47 +0100 Message-ID: From: Joel Reymont To: Goswin von Brederlow Cc: Gabriel Scherer , caml-list@inria.fr Content-Type: text/plain; charset=ISO-8859-1 Subject: Re: [Caml-list] using modules to wrap c++ classes On Fri, May 4, 2012 at 9:43 AM, Goswin von Brederlow wrote: > As discussed on irc you need to create your callbacks[] array as ocaml > block and register that itself as root. That also has the benefit that > you only have to register a single root instead of 50. Assuming that I have a class named MyCallbacks with a public member callbacks of type value, is this correct? Also, can I use Is_block to check if there's a closure value stored in the callbacks block before I dispatch to the closure? Thanks, Joel --- // finalizer, stored in custom_operations void Callbacks_delete(value v) { CAMLparam1(v); MyCallbacks* o = Callbacks_val(v); caml_remove_global_root(&o->callbacks); delete o; } CAMLprim value Callbacks_new() { CAMLparam0(); CAMLlocal2(v, cbks); v = caml_alloc_custom(&ops, sizeof(MyCallbacks*), 0, 1); MyCallbacks* o = new MyCallbacks(); Callbacks_val(v) = o; cbks = caml_alloc(NUM_CBKS, 0); o->callbacks = cbks; caml_register_global_root(&o->callbacks); CAMLreturn(v); } extern "C" CAMLprim value Callbacks_set(value self, value cbk) { CAMLparam2(self, cbk); MyCallbacks* o = Callbacks_val(self); Store_field(o->callbacks, Tag_val(cbk), Field(0, cbk)); CAMLreturn(Val_unit); } -------------------------------------------------------------------------- Working on AlgoKit, a new algorithmic trading platform using Rithmic R|API ---------------------+------------+--------------------------------------- http://wagerlabs.com | @wagerlabs | http://www.linkedin.com/in/joelreymont ---------------------+------------+---------------------------------------