Mantis Bug Tracker

View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0000385OCamlOCaml generalpublic2001-06-14 19:102001-07-02 14:09
Reporteradministrator 
Assigned To 
PrioritynormalSeverityfeatureReproducibilityalways
StatusacknowledgedResolutionopen 
PlatformOSOS Version
Product Version 
Target VersionFixed in Version 
Summary0000385: 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

TagsNo tags attached.
Attached Files

- Relationships

-  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
Powered by Mantis Bugtracker