Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

questions autour de caml_startup #2784

Closed
vicuna opened this issue Jun 14, 2001 · 5 comments
Closed

questions autour de caml_startup #2784

vicuna opened this issue Jun 14, 2001 · 5 comments

Comments

@vicuna
Copy link

vicuna commented Jun 14, 2001

Original bug ID: 385
Reporter: administrator
Status: closed (set by @mshinwell on 2016-12-08T10:35:03Z)
Resolution: not a bug
Priority: normal
Severity: feature
Category: runtime system and C interface

Bug 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

@vicuna
Copy link
Author

vicuna commented Jun 18, 2001

Comment author: administrator

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

@vicuna
Copy link
Author

vicuna commented Jun 19, 2001

Comment author: administrator

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

@vicuna
Copy link
Author

vicuna commented Jul 2, 2001

Comment author: administrator

Consider adding caml_startup_exn and a caml_cleanup function.

@vicuna
Copy link
Author

vicuna commented Jun 12, 2014

Comment author: @murmour

This report is possibly related to the unloadable runtime proposal:
#71

@vicuna
Copy link
Author

vicuna commented Dec 8, 2016

Comment author: @mshinwell

caml_startup_exn is now covered by #953.
Freeing of runtime memory is indeed covered by #71.
Please see those Github issues for further progress.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant