Version française
Home     About     Download     Resources     Contact us    
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: -- (:)
From: Olivier Andrieu <andrieu@i...>
Subject: Re: [Caml-list] GC and caml_oldify_local_roots taking too much time
 Christophe Raffalli [Mon, 19 Jul 2004]:
 > 
 > I identified the problem:
 > 
 > Glut.timerFunc does register the callback to each call and therefore 
 > allocate one glocal C root.
 > 
 > However, the callback in never unregistred (I do not know how to do 
 > that) and moreover, I register always the same function and therefore, 
 > it is always the same Global C root which is registered !
 > 
 > Is there a function to unregister a callback ?

No, but you needn't register the callback itself, you can register a
reference to it.

,----
| let callback = ref None
| external setup_c_callback : string -> unit = "setup_c_callback"
| let _ = 
|   let id = "my_caml_callback" in
|   Callback.register id callback ;
|   setup_c_callback id
| 
| let set_callback f = callback := Some f
| let unset_callback () = callback := None
`----

,----
| static value *my_caml_callback;
| 
| static void my_c_callback()
| {
|   if (my_caml_callback != NULL) {
|     value contents = Field(*my_caml_callback, 0);
|     if (Is_block(contents)) {
|       value closure = Field(contents, 0);
|       callback_exn(closure, Val_unit);
|     }
|   }
| }
| 
| CAMLprim value setup_c_callback(value id)
| {
|   my_caml_callback = caml_named_value(String_val(id));
|   setup_callback(&my_c_callback);
| }
`----

That way, Callback.register is only called once.

-- 
   Olivier

-------------------
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