From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@sympa.inria.fr Delivered-To: caml-list@sympa.inria.fr Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 126457FE07 for ; Wed, 3 Feb 2016 14:44:51 +0100 (CET) IronPort-PHdr: 9a23:gpjGZBIFXF+a5IAxc9mcpTZWNBhigK39O0sv0rFitYgUI/nxwZ3uMQTl6Ol3ixeRBMOAu60C0rSd6PuocFdDyKjCmUhKSIZLWR4BhJdetC0bK+nBN3fGKuX3ZTcxBsVIWQwt1Xi6NU9IBJS2PAWK8TWM5DIfUi/yKRBybrysXNWC0ILuiavpoNX6WEZhunmUWftKNhK4rAHc5IE9oLBJDeIP8CbPuWZCYO9MxGlldhq5lhf44dqsrtY4q3wD89pozcNLUL37cqIkVvQYSW1+ayFm0vb2rgHORhej4X4VU2Ne0kYZQluN0Bave571uSz+s6JY0TWTOc7/BeQxXD2+5qNoQTfnjS4GM3gy92SB2eJqi6cOjBu/phA3+I7ZbZ2OfK5lfq7QYcgyTG5cW4BUVjAHD4+hOdhcR9EdNPpV+tGu72AFqgGzUEzxXe4= Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=kosmo.zb@gmail.com; spf=Pass smtp.mailfrom=kosmo.zb@gmail.com; spf=None smtp.helo=postmaster@mail-yk0-f176.google.com Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of kosmo.zb@gmail.com) identity=pra; client-ip=209.85.160.176; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="kosmo.zb@gmail.com"; x-sender="kosmo.zb@gmail.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of kosmo.zb@gmail.com designates 209.85.160.176 as permitted sender) identity=mailfrom; client-ip=209.85.160.176; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="kosmo.zb@gmail.com"; x-sender="kosmo.zb@gmail.com"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@mail-yk0-f176.google.com) identity=helo; client-ip=209.85.160.176; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="kosmo.zb@gmail.com"; x-sender="postmaster@mail-yk0-f176.google.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0AoAgC6A7JWlLCgVdFehAxtBohVoRcFkAsBDYIGhWyBQQc4FAEBAQEBAQEBEAEBAQEHCwsJHzCCLYIVAQEEEhEEGQEtCwEDDAEFBQsDCgICCR0CAiEBEgEFAQoSBhMIChCHZAMSDqMNgTE+MYs0hECFYycDCkSDeQEXAQUKBG2DFIY6gjeBeYMCgToFhhQMkFGFSYYRgXOCJYxMhn+GBREegQ0eAQF3gUENGYFIPC6JawEBAQ X-IPAS-Result: A0AoAgC6A7JWlLCgVdFehAxtBohVoRcFkAsBDYIGhWyBQQc4FAEBAQEBAQEBEAEBAQEHCwsJHzCCLYIVAQEEEhEEGQEtCwEDDAEFBQsDCgICCR0CAiEBEgEFAQoSBhMIChCHZAMSDqMNgTE+MYs0hECFYycDCkSDeQEXAQUKBG2DFIY6gjeBeYMCgToFhhQMkFGFSYYRgXOCJYxMhn+GBREegQ0eAQF3gUENGYFIPC6JawEBAQ X-IronPort-AV: E=Sophos;i="5.22,391,1449529200"; d="scan'208";a="200931287" Received: from mail-yk0-f176.google.com ([209.85.160.176]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/AES128-GCM-SHA256; 03 Feb 2016 14:44:50 +0100 Received: by mail-yk0-f176.google.com with SMTP id z7so17927716yka.3 for ; Wed, 03 Feb 2016 05:44:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type:content-transfer-encoding; bh=WhnovNJ+UK/Z47U0vqkKq/xlscwQR2KYJn5/NMUqDLk=; b=yXoYaKAEnOoo/Lbb7jzn8DSM4W0WRedK6MAD5HfuTVBTiMpB5RDoYTX6wLc2ZNObG2 iwvuOrervBbdkBUFRPb1Dq2Hb333eVNfpZoNdH8n5Z80VSv7ACeEAcZfjWs9FWzjLHka aekkDN6d0FUl5GyX22DgkwKViLvlgJE7rQoT1rHorEVC4wgkKDZblp+1wWGvTPg4EqfW 391d0pgQtoAMRLH6yi7ZEsNXhV2T4TGdjP3RQAZx2pFXOef67mcgsZR1fLfW2bb8KGfB YtTWydmYI7UVJKIyldIbLk2Ovf4v9ObGbCb1+LfPmuE777s3FFz6Y4U287gw0xS0PtPV wFCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:date :message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=WhnovNJ+UK/Z47U0vqkKq/xlscwQR2KYJn5/NMUqDLk=; b=H/PhH0iecCCaDxZ8eTtVWme2MUSUxbqQdO24F3/lD1cUR4A42k03niKcQxrMspQOyy UVeJLqMwSlRdErs6A8jkFia4QqSjs59gnwkLvR0w9P1lmosOoNTouU/oViqVnLgGEoOM d7Zc22k/Wene0nn1yQSJS9t0Rr4cQ9SYkkX3JqMz8CqPy8aQbmvIShlde79AY6bru4KV pSluI0NnfaLKMliwJYfR5Xuc4/QvI3yEEM8uM/m13Fw27TSV2v6SgcH45xZdj8tEXoQ0 LMaENaN1paOYjZ8fdXT0rTQQN+FN9oIiTyhDS1ZJiRAEXDsKgjjghefDIF6Fj4bHgduT DzhQ== X-Gm-Message-State: AG10YOTqueQ/8Ukc1wtmiXIgskIecX7Xkq5dl1lPVWNIS1LRC+SAvT4pxB6Av8U4+IUPdNf+SOYdXJQiTVe0EQ== MIME-Version: 1.0 X-Received: by 10.129.145.82 with SMTP id i79mr851999ywg.345.1454507088888; Wed, 03 Feb 2016 05:44:48 -0800 (PST) Sender: kosmo.zb@gmail.com Received: by 10.13.225.136 with HTTP; Wed, 3 Feb 2016 05:44:48 -0800 (PST) In-Reply-To: <86r3guq8t4.fsf@gmail.com> References: <56B1DC54.1060109@tu-berlin.de> <86r3guq8t4.fsf@gmail.com> Date: Wed, 3 Feb 2016 13:44:48 +0000 X-Google-Sender-Auth: AR21q2z4vyC-DPMcKpx2p-U9CGc Message-ID: From: David Sheets To: Malcolm Matalka Cc: Jeremie Dimino , =?UTF-8?Q?Christoph_H=C3=B6ger?= , caml users Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Caml-list] Save callbacks from OCaml to C On Wed, Feb 3, 2016 at 12:26 PM, Malcolm Matalka wrote: > Jeremie Dimino writes: > >> On Wed, Feb 3, 2016 at 10:54 AM, Christoph H=C3=B6ger < >> christoph.hoeger@tu-berlin.de> wrote: >> >>> void g(void* user_data, double t, double const *x, double *g) { >>> const struct interface_data* data =3D ((struct interface_data*)user_d= ata); >>> static long count =3D 0; >>> count++; >>> >>> /* Wrap the values in fresh big arrays */ >>> value ml_t =3D caml_copy_double(t); >>> value ml_x =3D caml_ba_alloc_dims(CAML_BA_FLOAT64 | CAML_BA_C_LAYOUT,= 1, >>> (double*)x, data->qs->n); >>> value ml_g =3D caml_ba_alloc_dims(CAML_BA_FLOAT64 | CAML_BA_C_LAYOUT,= 1, >>> g, data->qs->mc); >>> >>> /* call the OCaml callback */ >>> caml_callback3(data->g, ml_t, ml_x, ml_g); >>> } >>> >>> Is there anything obvious, I am doing wrong? >>> >> >> You need to register [ml_t], [ml_x] and [ml_g >> ] as GC roots. Otherwise if the GC runs in caml_ba_alloc for instance, >> [ml_t] might ends up containing garbage even before reaching >> [caml_callback3]. You can use the normal macros for that: >> >> void g(...) { >> CAMLparam0(); >> CAMLlocal3(ml_t, ml_x, ml_g); >> ... >> CAMLreturn0; >> } >> >> Note that &(user_data->g) must be a GC root as well. Are you registering >> &(user_data->g) with the GC in any way? >> >> >> -- >> Jeremie > > If one is using ctypes, is all of this taken care of? I have a library > that registers a bunch of Ocaml functions in C code, which the C code > calls. I haven't experienced anything bad happening yet, but that > doesn't mean much... If you use ctypes and pass OCaml closures to C, you *must* retain a reference to the closure to avoid it being GCed. If you do not, you may experience the exception CallToExpiredClosure sporadically. > -- > Caml-list mailing list. Subscription management and archives: > https://sympa.inria.fr/sympa/arc/caml-list > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs