[
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: | Xavier Leroy <xavier.leroy@i...> |
| Subject: | Re: [Caml-list] end-of-block CAMLreturn? |
> Is there a way to do a CAMLreturn without the return? From looking at
> memory.h it appears not, but it appears it would be easy to make a
> macro to do it (#define CAMLendblock local_roots = caml__frame; or
> something like that should work).
>
> In other words, I want to have a loop that calls back to caml, but I
> don't want to keep shoving more stuff on the roots list, since I don't
> care about the previous loop's allocations:
>
> for(i=0;i<n;++i) {
> CAMLlocal(foo,bar);
> // use foo bar
> // callback to caml with foo bar, maybe somebody stores them somewhere
> CAMLendblock(); // want this
> }
If I follow you correctly, there are two ways to achieve the desired
behavior. One is to use the older API for GC root registration:
Begin_roots and End_roots. (There is some documentation in comments
in file <caml/memory.h>.)
for(i=0;i<n;++i) {
foo = bar = Val_unit;
Begin_roots(foo,bar);
// use foo bar
// callback to caml with foo bar, maybe somebody stores them somewhere
End_roots();
}
The other way, perhaps preferable, is to move the root registration
outside the loop:
CAMLlocal(foo,bar);
for(i=0;i<n;++i) {
// use foo bar
// callback to caml with foo bar, maybe somebody stores them somewhere
foo = bar = Val_unit; /* don't keep roots longer than necessary
}
CAMLreturn(whatever);
Hope this helps,
- Xavier Leroy
-------------------
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