From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by yquem.inria.fr (Postfix) with ESMTP id A0638BC6C for ; Thu, 7 Feb 2008 00:55:16 +0100 (CET) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao8CAC3XqUdFHnvD/2dsb2JhbACtFg X-IronPort-AV: E=Sophos;i="4.25,314,1199660400"; d="scan'208";a="22320851" Received: from galois.com (HELO mail.galois.com) ([69.30.123.195]) by mail4-smtp-sop.national.inria.fr with ESMTP; 07 Feb 2008 00:55:14 +0100 Received: from [10.0.1.198] (c-24-21-193-248.hsd1.mn.comcast.net [24.21.193.248]) (authenticated bits=0) by mail.galois.com (8.13.8/8.13.8) with ESMTP id m16NsvaO013806 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 6 Feb 2008 15:55:04 -0800 Message-Id: <85FB0157-5721-45F1-9440-A3021913BA1F@galois.com> From: Joel Stanley To: caml-list@yquem.inria.fr Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v915) Subject: Using the C FFI to wrap an OCaml library Date: Wed, 6 Feb 2008 15:54:56 -0800 X-Mailer: Apple Mail (2.915) X-Virus-Scanned: ClamAV 0.92/5715/Wed Feb 6 13:50:46 2008 on liouville.galois.com X-Virus-Status: Clean X-Spam: no; 0.00; ffi:01 ocaml:01 ocaml:01 ffi:01 camlparam:01 camlreturn:01 camlparam:01 camlreturn:01 oldify:01 solver:01 solver:01 elided:01 expansions:01 alloc:01 malloc:01 Hi everyone, I have a couple of questions about the OCaml FFI. I'm attempting to wrap up an existing OCaml library and provide a C API for it, as opposed to the other way around, which seems to be much more common. 1. Can the CAMLparam*/CAMLlocal*/CAMLreturn macros be used to safely carry values of type 'value' between C functions (even C functions that have the appropriate CAMLparam/CAMLreturn invocations present)? I thought this worked, but more extensive testing has yielded some hangs with the stack trace looking like: #0 0x00002b98 in caml_oldify_local_roots () #1 0x00004dd7 in caml_empty_minor_heap () #2 0x00004f28 in caml_minor_collection () #3 0x00003501 in caml_garbage_collection () #4 0x00011888 in caml_call_gc () #5 0x00013577 in run_solver () #6 0x00013cb4 in main () where run_solver here is the C function that is passed an opaque object reference (elided by a value of type 'value') from another C function, and is calling methods repeatedly on the provided object via caml_callback. Looking at the macro expansions, I'm suspicious about the safety between C functions, and wonder if the only way to carry data is use caml_register_global_root (and manage my own memory if I need dynamic allocation). 2. As a follow-up question to #1, the OCaml values may need to be carried across yet another FFI, in this case, C <-> Poly/ML . Even if using the macros was a safe way to carry values between C functions, I"m not sure I can easily replicate the macros on the other side of the FFI, so am wondering if an explicit memory management approach using caml_register_global_root will work. E.g., value* alloc_value() { value* p = malloc(sizeof(value)); caml_register_global_root(p); return p; } Any help is greatly appreciated. -- Joel Stanley