From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: weis Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id AAA31119 for caml-redistribution@pauillac.inria.fr; Fri, 18 Feb 2000 00:33:18 +0100 (MET) Resent-Message-Id: <200002172333.AAA31119@pauillac.inria.fr> Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id QAA00690 for ; Wed, 16 Feb 2000 16:41:45 +0100 (MET) Received: from air.irisa.fr (air.irisa.fr [131.254.60.130]) by nez-perce.inria.fr (8.8.7/8.8.7) with ESMTP id QAA05246 for ; Wed, 16 Feb 2000 16:41:44 +0100 (MET) Received: from parate.irisa.fr (parate.irisa.fr [131.254.12.25]) by air.irisa.fr (8.9.3/8.9.3) with ESMTP id QAA06289 for ; Wed, 16 Feb 2000 16:41:43 +0100 (MET) Sender: David.Mentre@irisa.fr To: caml-list@inria.fr Subject: Calling C from OCaml, GC problems From: David.Mentre@irisa.fr (David=?iso-8859-1?q?_Mentr=E9?=) Date: 16 Feb 2000 16:41:42 +0100 Message-ID: User-Agent: Gnus/5.0803 (Gnus v5.8.3) Emacs/20.4 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Resent-From: weis@pauillac.inria.fr Resent-Date: Fri, 18 Feb 2000 00:33:18 +0100 Resent-To: caml-redistribution@pauillac.inria.fr Hello all Camlists, A friend of mine and me are trying to interface CMU bdd library (in C) with OCaml. We have a rough code but a bug is still alive. I still have some questions relative to OCaml and C interfacing: 1. the ocaml doc (paragraph 15.5) states that CAMLparam and CAMLreturn macros should be used. However, example code in 15.7 does not use them (even if functions have value typed parameters). The Unix interfacing code ocaml-2.04/otherlibs/unix/) doesn't use those macro either. Faulty doc? Are those macros not mandatory? What is the rationale? 2. when compiling, I've tons of warning like this: bdd_interface.c: In function `mlbdd_alloc_manager': bdd_interface.c:136: warning: left-hand operand of comma expression has no effect bdd_interface.c:136: warning: unused variable `caml__dummy_result' the corresponding C code is: value mlbdd_alloc_manager(MANAGER m) { CAMLparam0(); CAMLlocal1 (result); bdd_overflow_closure(m, mlbdd_overflow, NULL); result = alloc_final(Size_ml_manager, mlbdd_free_manager, 0, 1); Manager_store_pointer(result, (value)m); PRINT_DEBUG("Alloc manager"); CAMLreturn result; } Did I use wrongly those CAML* macros? 3. The code is running on small examples but segfault on bigger ones. From gdb backtrace, it seems clear that my bug is releated to a GC problem: (gdb) bt #0 0x8065c45 in mark_slice () #1 0x806607b in major_collection_slice () #2 0x8066663 in minor_collection () #3 0x80666ac in check_urgent_gc () #4 0x805ba53 in alloc_final () #5 0x804e0fc in mlbdd_alloc_vbdd (m=0x809f020, b=0x80f55b9) at bdd_interface.c:204 #6 0x804ec85 in mlbdd_or (vb1=717431320, vb2=717431288) at bdd_interface.c:441 #7 0x80645bb in interprete () #8 0x80656d3 in caml_main () #9 0x805b1d5 in main () #10 0x2ab457e2 in __libc_start_main () from /lib/libc.so.6 The bdd library is using itself a memory management library calling sbrk(2). Can it trigger problems with OCaml GC (like the GC going into bdd structures)? Below URL's to C and OCaml interface codes if somebody need them: http://www.irisa.fr/paris/pages-perso/David-Mentre/bdd.ml http://www.irisa.fr/paris/pages-perso/David-Mentre/bdd_interface.c Many thanks in advance for any help. best regards, david -- David.Mentre@irisa.fr -- http://www.irisa.fr/prive/dmentre/ Opinions expressed here are only mine.