From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id QAA14076; Tue, 20 Jul 2004 16:00:45 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id QAA12773 for ; Tue, 20 Jul 2004 16:00:44 +0200 (MET DST) Received: from postfix3-1.free.fr (postfix3-1.free.fr [213.228.0.44]) by concorde.inria.fr (8.12.10/8.12.10) with ESMTP id i6KE0hSH024712; Tue, 20 Jul 2004 16:00:43 +0200 Received: from univ-savoie.fr (grenoble-1-62-147-73-142.dial.proxad.net [62.147.73.142]) by postfix3-1.free.fr (Postfix) with ESMTP id 9F7471739C1; Tue, 20 Jul 2004 16:00:31 +0200 (CEST) Message-ID: <40FD79F9.6040309@univ-savoie.fr> Date: Tue, 20 Jul 2004 16:00:57 -0400 From: Christophe Raffalli User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040115 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Damien Doligez , Jacques Garrigue , Issac Trotts Cc: caml-list Subject: [Caml-list] Calback (was caml_oldify_local_roots taking too much time) References: <40FC0BEF.4080909@univ-savoie.fr> <3B84CC2A-D97E-11D8-A7B0-00039310CAE8@inria.fr> In-Reply-To: <3B84CC2A-D97E-11D8-A7B0-00039310CAE8@inria.fr> X-Enigmail-Version: 0.83.3.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-Miltered: at concorde with ID 40FD258B.001 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Loop: caml-list@inria.fr X-Spam: no; 0.00; raffalli:01 raffalli:01 univ-savoie:01 oldify:01 passing:01 callback:01 callback:01 hashtable:01 passing:01 hashtable:01 indirection:01 hashtables:01 int-:01 'a-:01 camlprim:01 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk 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 ? For instance Glut.idleFunc will do a search in the hashtable of caml names at each callback and if the callback was transmitted through a C global variable there vould only be one indirection ? I am about to change all the callback mechnism used in Glut. So if anyone knows a good reason to use names and hashtables ? ----- 8< ----- here is the code ----- 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 *) ----- Then the C code: -- // 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; leave_blocking_section (); value fun = Field(*v, 0); value arg = Field(*v, 1); caml_remove_global_root(v); free(v); callback (fun, arg); enter_blocking_section (); } CAMLprim value ml_glutTimerFunc(value millis_val, value fun_arg) // set Timer callback { // fun_arg is a caml pair with a function and its argument we register a root on this pair and set the callback. unsigned int millis; value *v = (value*) malloc(sizeof(value)); *v = fun_arg; caml_register_global_root(v); millis = Int_val(millis_val); glutTimerFunc(millis, &glutTimerFunc_cb, (int) v); // register with GLUT return Val_unit; } -- Christophe Raffalli Université de Savoie Batiment Le Chablais, bureau 21 73376 Le Bourget-du-Lac Cedex tél: (33) 4 79 75 81 03 fax: (33) 4 79 75 87 42 mail: Christophe.Raffalli@univ-savoie.fr www: http://www.lama.univ-savoie.fr/~RAFFALLI --------------------------------------------- IMPORTANT: this mail is signed using PGP/MIME At least Enigmail/Mozilla, mutt or evolution can check this signature --------------------------------------------- ------------------- 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