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 mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id D6FA77FE07 for ; Wed, 3 Feb 2016 13:26:30 +0100 (CET) IronPort-PHdr: 9a23:JKNcSBKIMZ4wvEnrt9mcpTZWNBhigK39O0sv0rFitYgUIv3xwZ3uMQTl6Ol3ixeRBMOAu60C0rSd6v6ocFdDyKjCmUhKSIZLWR4BhJdetC0bK+nBN3fGKuX3ZTcxBsVIWQwt1Xi6NU9IBJS2PAWK8TWM5DIfUi/yKRBybrysXNWC0ILuiavrpdX6WEZhunmUWftKNhK4rAHc5IE9oLBJDeIP8CbPuWZCYO9MxGlldhq5lhf44dqsrtY4q3wD89pozcNLUL37cqIkVvQYSW1+ayFmrPHs4DvOVwaK53ZUfmQTkxxPS1zH4BD/X5H2minzsOdmxDOXMNGwRrcxD2eM9aBuHTrhjCwAMztx1WjLg8hzheoPpReouxV7wIf8b4ScNf44daTYK4BJDVFdV9pcAnQSSri3aJECWq9YZb5V Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=mmatalka@gmail.com; spf=Pass smtp.mailfrom=mmatalka@gmail.com; spf=None smtp.helo=postmaster@mail-wm0-f53.google.com Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of mmatalka@gmail.com) identity=pra; client-ip=74.125.82.53; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="mmatalka@gmail.com"; x-sender="mmatalka@gmail.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of mmatalka@gmail.com designates 74.125.82.53 as permitted sender) identity=mailfrom; client-ip=74.125.82.53; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="mmatalka@gmail.com"; x-sender="mmatalka@gmail.com"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: None (mail3-smtp-sop.national.inria.fr: no sender authenticity information available from domain of postmaster@mail-wm0-f53.google.com) identity=helo; client-ip=74.125.82.53; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="mmatalka@gmail.com"; x-sender="postmaster@mail-wm0-f53.google.com"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0B1AAAz8bFWlDVSfUpehHmIW59ghxGKTQENgWSGDQKBQjgUAQEBAQEBAQEQAQEBAQcLCwkfMIItghUBAQQSEQQZARsdAQMBCwYFCwMKAgIFIQICDwEEDxEBBQEiEyKHYwEDEgSif4ExPjGLNIFpgleFRQoZJw1Rg2ABAQEBAQUBAQEBAQEUAQUKBG2DFIIDhDeEMIMCgToFlnGNTYkShV+NBC+BDR4BAYI4DREIgUhqiWsBAQE X-IPAS-Result: A0B1AAAz8bFWlDVSfUpehHmIW59ghxGKTQENgWSGDQKBQjgUAQEBAQEBAQEQAQEBAQcLCwkfMIItghUBAQQSEQQZARsdAQMBCwYFCwMKAgIFIQICDwEEDxEBBQEiEyKHYwEDEgSif4ExPjGLNIFpgleFRQoZJw1Rg2ABAQEBAQUBAQEBAQEUAQUKBG2DFIIDhDeEMIMCgToFlnGNTYkShV+NBC+BDR4BAYI4DREIgUhqiWsBAQE X-IronPort-AV: E=Sophos;i="5.22,390,1449529200"; d="scan'208";a="162783961" Received: from mail-wm0-f53.google.com ([74.125.82.53]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/AES128-GCM-SHA256; 03 Feb 2016 13:26:30 +0100 Received: by mail-wm0-f53.google.com with SMTP id l66so161149020wml.0 for ; Wed, 03 Feb 2016 04:26:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-type:content-transfer-encoding; bh=UPFrzzqSuyIvHGQljrFkg4Qjl+XqpcikIg8/2TIf5i4=; b=Pr5Ws9LhuCqqRUT75d7jmhaiGA3By1J85ruh3eHEMGncJGwTAWxSvK7DreC5aShU++ pd86MH+mb+wXWumH9EO9hlaxPA1Y4NIoOsEabiMxAlGQVTiW0/oKQtIp/MFZX4UNJWUm WDWeIGu79aCVk7QE1726v1Q3X28viHeBM58IIGDAi8wmNzbdnFBNpa/r5vsFfNXCjLcF gqtySJJhTZDEkTZ48mPQjpqynJUmftLZgibSSUbgTA1LZ46AhFKCNH4Ewl3e3g2V8Fko pLzuC0wkUz4BJNKHbleR2M4UYVyBT+DCWAKZY9Zwgt2a2zLhGNyaahcsQVdMO9L9jMFB dpoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version:content-type :content-transfer-encoding; bh=UPFrzzqSuyIvHGQljrFkg4Qjl+XqpcikIg8/2TIf5i4=; b=lwY8D+bjJ+4KGs6bSLdfyAx2NQ4MucfULpYaJDo8idgBgmdFW0hW3I2HrGUBZqY69J 754B/Aoem9J6JuiM0kVnClu3/Xu8bjtf0XU038pJVN8VBZhOOTofBN2/KQ8CImHHu5w5 DHZLPeDMOjrOaRwlvKGL+qeWfSZE9R3NEJY0VnI2T3a9qjNyJDetAlSM117SJFj13VyO ZfFHh5kssqMUSEVCziacM++6JmnQ7FfbFKUlTiG6uZB8VNyeThnCnpnAlrT08Nsvsrn3 2Rsm57GS7WSnqRDdJCTysY5f3cvZ6HvHdLO9K6E3Fj9f1Wjn5gh1nNmqLNeESK70iB4e /a1g== X-Gm-Message-State: AG10YOToqfV1VNrUJATcOgeiBsu3WBypxU1pJk4foCkLdxtJi3/mJR21MwKCg8scqqeqHQ== X-Received: by 10.194.79.163 with SMTP id k3mr1555189wjx.117.1454502389917; Wed, 03 Feb 2016 04:26:29 -0800 (PST) Received: from localhost ([37.153.108.22]) by smtp.gmail.com with ESMTPSA id v66sm3805897wmb.18.2016.02.03.04.26.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 03 Feb 2016 04:26:28 -0800 (PST) From: Malcolm Matalka To: Jeremie Dimino Cc: Christoph =?utf-8?Q?H=C3=B6ger?= , caml users References: <56B1DC54.1060109@tu-berlin.de> Date: Wed, 03 Feb 2016 12:26:15 +0000 In-Reply-To: (Jeremie Dimino's message of "Wed, 3 Feb 2016 11:48:47 +0000") Message-ID: <86r3guq8t4.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (berkeley-unix) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Caml-list] Save callbacks from OCaml to C 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_da= ta); >> 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? >> > > =E2=80=8BYou need to register [ml_t], [ml_x] and [ml_g=E2=80=8B > ] 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; > } > > =E2=80=8BNote that &(user_data->g) must be a GC root as well. Are you reg= istering > &(user_data->g) with the GC in any way? > =E2=80=8B > =E2=80=8B > --=20 > 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...