From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id WAA17261; Wed, 28 May 2003 22:37:44 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f 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 WAA17250 for ; Wed, 28 May 2003 22:37:43 +0200 (MET DST) Received: from smtp5.wanadoo.nl (smtp5.wanadoo.nl [194.134.35.176]) by nez-perce.inria.fr (8.11.1/8.11.1) with ESMTP id h4SKbgT19624 for ; Wed, 28 May 2003 22:37:42 +0200 (MET DST) Received: from wanadoo.nl (p5375.vwr.wanadoo.nl [62.234.195.7]) by smtp5.wanadoo.nl (Postfix) with ESMTP id 1871374862; Wed, 28 May 2003 22:37:39 +0200 (CEST) Message-ID: <3ED51D27.3000301@wanadoo.nl> Date: Wed, 28 May 2003 22:33:43 +0200 From: Maas-Maarten Zeeman User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0) Gecko/20020623 Debian/1.0.0-0.woody.1 X-Accept-Language: en MIME-Version: 1.0 To: "Mary F. Fernandez" Cc: caml-list@inria.fr, Jerome Simeon Subject: Re: [Caml-list] Question about register_global_root References: <3ED511E5.8060401@research.att.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam: no; 0.00; caml-list:01 malloc:01 callback:01 sizeof:01 alloc:01 val:01 crashing:01 ocaml:01 caml:01 garbage:01 referenced:02 unit:03 pointer:03 behaves:03 heap:03 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk Hello, I'm by far no Caml expert, but it works pretty well for me in OcamlExpat, an OCaml wrapper for Expat I wrote a while back. I use a malloced value to store a pointer to a tuple, which is used to store event handlers (ocaml functions). This is what I did: /* Malloc a value for a tuple which will contain the callback * handlers and register it as global root. */ handlers = (value *) malloc(sizeof(value)); register_global_root(handlers); *handlers = alloc_tuple(NUM_HANDLERS); for(i = 0; i < NUM_HANDLERS; i++) { Field(*handlers, i) = Val_unit; } One thing to keep in mind is that you have to be really careful, and use the right CAMLxxxx macro in the right place, otherwise things start crashing at seemingly random times. The reason for this is that the global root will correctly stay at the same memory location, but any ocaml values stored in the root can move during a garbage collection cycle. If you do not use the CAMLxxxx macro's correctly the values will change, and move in the middle of your c-function, which almost always results in a crashing program. It is very easy to make mistakes here, but there is a way to (sort of) test if your c-extension behaves correctly. If you call "Gc.full_major ()" in your tests you will know almost instantly if there is a problem related to garbage collection, and possible incorrect use of CAMLxxxx macros (at least that is the idea). Regards, Maas > Hi Caml experts, > We are using register_global_root to register addresses in the malloc'd > C heap that contain Caml values. We noticed that register_global_root > (comment below) expects a global C variable, but we assumed that it > should > work with malloc'd addresses as well. Is there any reason that it > would not? > > /* [register_global_root] registers a global C variable as a memory root > for the duration of the program, or until [remove_global_root] is > called. */ > > We are getting (somewhat random) core dumps after calling the same Caml > function repeatedly on the same Caml value (which is referenced > from the C heap). > > Thanks, > Mary ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners