From: Maas-Maarten Zeeman <maas@wanadoo.nl>
To: "Mary F. Fernandez" <mff@research.att.com>
Cc: caml-list@inria.fr, Jerome Simeon <simeon@research.bell-labs.com>
Subject: Re: [Caml-list] Question about register_global_root
Date: Wed, 28 May 2003 22:33:43 +0200 [thread overview]
Message-ID: <3ED51D27.3000301@wanadoo.nl> (raw)
In-Reply-To: <3ED511E5.8060401@research.att.com>
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
next prev parent reply other threads:[~2003-05-28 20:37 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-05-28 19:45 Mary F. Fernandez
2003-05-28 19:51 ` Alexander V. Voinov
2003-05-28 20:33 ` Maas-Maarten Zeeman [this message]
2003-05-29 1:31 ` Jerome Simeon
2003-06-01 7:24 ` Chris Hecker
2003-06-01 10:50 ` Maas-Maarten Zeeman
2003-06-01 11:10 ` Chris Hecker
2003-06-01 19:53 ` Damien Doligez
2003-06-02 11:37 ` Jerome Simeon
2003-06-02 12:11 ` Maas-Maarten Zeeman
2003-06-02 12:19 ` [Caml-list] Am I mad?: OCaml for scientific scripting Siegfried Gonzi
2003-06-02 12:21 ` Siegfried Gonzi
2003-06-02 16:21 ` [Caml-list] Question about register_global_root Harry Chomsky
2003-06-02 20:02 ` Maas-Maarten Zeeman
2003-06-03 0:05 ` Chris Hecker
2003-06-01 19:19 ` Florian Douetteau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3ED51D27.3000301@wanadoo.nl \
--to=maas@wanadoo.nl \
--cc=caml-list@inria.fr \
--cc=mff@research.att.com \
--cc=simeon@research.bell-labs.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox