Browse thread
[Caml-list] Question about register_global_root
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Jerome Simeon <simeon@r...> |
| Subject: | Re: [Caml-list] Question about register_global_root |
Thanks Maas,
We managed to pin down that *!@#! bug after all. You mail was very
helpful.
- Jerome
On Wed, 2003-05-28 at 16:33, Maas-Maarten Zeeman wrote:
> 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
>
>
--
Jerome Simeon <simeon@research.bell-labs.com>
Lucent Technologies
-------------------
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