Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
[Caml-list] GC and caml_oldify_local_roots taking too much time
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2004-07-20 (14:40)
From: Olivier Andrieu <andrieu@i...>
Subject: Re: [Caml-list] Calback
 Christophe Raffalli [Tue, 20 Jul 2004]:
 > Thanks for the help on the list. I decided to change Glut.timerFunc
 > for the following code, passing the Caml function and its argument
 > using a C int (transmitted to the times) which is in fact a pointer
 > to a Caml pair. This pointer is registered as a global root and
 > removed by the callback itself. I give the code bellow if someone
 > wants to write something similar.
 > A small question: why do people use callback trough a name and a
 > hashtable instead of passing the callback inside C variables
 > (global or local) ? It could save a lot of time ?

(caml_named_value uses a linked list, not a hashtable).

 > ----- First the caml code:
 > (* timerFunc is non-window-dependent *)
 > external _glutTimerFunc : int->((value:'a->'b) * 'a)->unit = 
 > "ml_glutTimerFunc"
 > let timerFunc ~ms ~cb ~value:v : (unit) =
 >      _glutTimerFunc ms (cb,v);; (* register the callback with GLUT *)

It's just easier not to bother with the argument and have the callback
be of type `unit -> unit' (or `unit -> 'a'), since you can include any
argument you like in the closure.

 > // for timer we can not use Register.callback because it grows 
 > infinitely the
 > // number of global root
 > static void glutTimerFunc_cb(int fun_arg)
 > {
 >    // fun_arg is a pointer on a caml pair hidden in an integer.
 >    // Moreover we remove the global root because each callback is used once
 >    // by the timer.
 >    value *v = (value) fun_arg;

I'm afraid this will break on plaforms where `sizeof (int) != sizeof (long)'.


To unsubscribe, mail Archives:
Bug reports: FAQ:
Beginner's list: