| Anonymous | Login | Signup for a new account | 2013-05-18 12:31 CEST | ![]() |
| Main | My View | View Issues | Change Log | Roadmap |
| View Issue Details [ Jump to Notes ] | [ Issue History ] [ Print ] | ||||||||||
| ID | Project | Category | View Status | Date Submitted | Last Update | ||||||
| 0000385 | OCaml | OCaml general | public | 2001-06-14 19:10 | 2001-07-02 14:09 | ||||||
| Reporter | administrator | ||||||||||
| Assigned To | |||||||||||
| Priority | normal | Severity | feature | Reproducibility | always | ||||||
| Status | acknowledged | Resolution | open | ||||||||
| Platform | OS | OS Version | |||||||||
| Product Version | |||||||||||
| Target Version | Fixed in Version | ||||||||||
| Summary | 0000385: questions autour de caml_startup | ||||||||||
| Description | Bonjour, Voici deux questions sur l'appel de Objective Caml depuis un programme principal en C et sur caml_startup : Comment récupérer depuis un programme principal C une exception déclenchée lors de la déclaration d'une valeur, c'est à dire du type : value _ = raise (Failure "from value"); ? Si je comprends bien cette exception est déclenchée lors de l'appel à caml_startup(argv). Mais il n'y a pas semble-t-il de caml_startup_exn (comme les callback[123]_exn) pour éviter l'appel à fatal_uncaught_exception et donc à exit(2); Est-ce que qu'il faudrait un caml_startup_exn ? D'autre part, toujours sur caml_startup : Comment libérer depuis C toute la mémoire allouée par caml_startup(argv) ? Est-ce qu'il y a un moyen de faire un caml_cleanup() ? Merci d'avance pour toute aide Cordialement, Maurice Brémond LEGOS/GRGS 14 Ae Edouard Belin 31400 Toulouse | ||||||||||
| Tags | No tags attached. | ||||||||||
| Attached Files | |||||||||||
Notes |
|
|
(0000109) administrator (administrator) 2001-06-18 11:41 |
> Voici deux questions sur l'appel de Objective Caml depuis un programme > principal en C et sur caml_startup : > > Comment récupérer depuis un programme principal C une exception déclenchée > lors de la déclaration d'une valeur, c'est à dire du type : > > value _ = raise (Failure "from value"); ? > > Si je comprends bien cette exception est déclenchée lors de l'appel à > caml_startup(argv). Mais il n'y a pas semble-t-il de caml_startup_exn (comme > les callback[123]_exn) pour éviter l'appel à fatal_uncaught_exception et donc > à exit(2); > Est-ce que qu'il faudrait un caml_startup_exn ? Peut être. Une manière de contourner le problème est d'avoir un programme Caml dont l'initialisation ne fait rien d'autre que d'enregistrer une fonction de callback qui fait tout le travail, et d'appeler cette fonction avec callback_exn. > D'autre part, toujours sur caml_startup : > > Comment libérer depuis C toute la mémoire allouée par caml_startup(argv) ? > Est-ce qu'il y a un moyen de faire un caml_cleanup() ? Pas pour le moment. Là encore, l'idée de départ était d'appeler caml_startup une seule fois au "début du monde", de laisser la machine Caml active tout au long de l'exécution du programme principal, et de faire des callbacks quand nécessaire. Très cordialement, - Xavier Leroy |
|
(0000110) administrator (administrator) 2001-06-19 17:27 |
>Peut être. Une manière de contourner le problème (...) Je prefére ne pas le contourner. Bon en fait, dans mon cas, je trouve que le risque de déclenchement d'exception de ce type dans un module d'une librairie externe est suffisamment faible pour être supportable. Et la contrainte de ne pas pouvoir s'en servir est négligeable comparée à celle de devoir tout mettre dans une fonction. Enfin bon ce peut être un simple souhait cosmétique pour un caml_startup_exn() qui rendrait une value res au lieu d'un appel à fatal_uncaught_exception() juste pour les cas où ... >Pas pour le moment (...) Pour ma part, j'en avais besoin pour des fonctions utilisateurs externes intégrées dynamiquement dans une application. Ici c'est Matlab, ces fonctions externes sont d'habitude écrites en C ou Fortran et je trouve intéressant de les écrire en Caml. Alors, le début du monde correspond à la première lecture par l'application de la fonction utilisateur Caml, la machine Caml reste active entre deux appels depuis le prompt de l'application et tout ça marche très bien. Lorsque les sources Caml sont modifiés et recompilés, avant de charger la nouvelle version, il faut (faudrait) effacer nécessairement la précédente version en mémoire. Donc, il faudrait éteindre complètement la machine Caml avant d'en relancer une autre. Relancer toute l'application est pénible. Ça peut prendre plusieurs longues secondes parce qu'il y a tout un environnement à mettre en place, de gros fichiers à lire, etc. Il y a aussi le risque d'essuyer un refus de la part du controleur de licenses. Pour l'instant je sais que tout ce qui est déclaré à l'intérieur des fermetures Caml peut être définitivement libéré par le GC avec un gc_full_major () mais tout ce qui est déclaré au niveaux des valeurs reste en mémoire avec tout ce qui est nécessaire à la machine caml. Et cette mémoire est ensuite perdue lors du prochain caml_startup. Donc tout marche quand même, mais avec une augmentation de la mémoire allouée qui suit les chargements successifs des fonctions externes Caml. Peut être qu'il y a, via une astuce, un moyen simple de faire une partie du travail (la libération de tout ce qui est déclaré au niveaux des valeurs) par le GC ? Enfin, sinon voilà, ce n'est qu'un souhait pour un caml_cleanup () ... Merci Cordialement, Maurice Brémond |
|
(0000111) administrator (administrator) 2001-07-02 14:09 |
Consider adding caml_startup_exn and a caml_cleanup function. |
Issue History |
|||
| Date Modified | Username | Field | Change |
| 2005-11-18 10:13 | administrator | New Issue | |
| Copyright © 2000 - 2011 MantisBT Group |